我是编程和C的新手,我目前正在大学学习。这是一个任务,所以我想避免直接的答案,但更多的提示或提示/推动正确的方向。
我试图使用strtol来验证我的键盘输入,更具体地说,测试输入是否为数字。我已经查看过这里和其他网站上的其他问题,我已经按照给其他用户的说明,但它没有帮助我。
从我读取/理解的strtol(long int strtol(const char * str,char ** endptr,int base);)如果endptr不是空指针,该函数将endptr的值设置为第一个字符在号码之后。
因此,如果我要输入84948ldfk,则endptr将指向'l',告诉我输入中除了数字之外还有其他字符会使其无效。
然而在我的情况下,正在发生的事情是,无论我输入什么,我的程序返回一个无效的输入。这是我的代码:
void run_perf_square(int *option_stats)
{
char input[MAX_NUM_INPUT + EXTRA_SPACES]; /*MAX_NUM_INPUT + EXTRA_SPACES are defined
*in header file. MAX_NUM_INPUT = 7
*and EXTRA_SPACES
*(for '\n' and '\0') = 2. */
char *ptr;
unsigned num=0; /*num is unsigned as it was specified in the start up code for the
*assignment. I am not allow to change it*/
printf("Perfect Square\n");
printf("--------------\n");
printf("Enter a positive integer (1 - 1000000):\n");
if(fgets(input, sizeof input, stdin) != NULL)
{
num=strtol(input, &ptr, 10);
if( num > 1000001)
{
printf("Invalid Input! PLease enter a positive integer between 1
and 1000000\n");
read_rest_of_line(); /*clears buffer to avoid overflows*/
run_perf_square(option_stats);
}
else if (num <= 0)
{
printf("Invalid Input! PLease enter a positive integer between 1
and 1000000\n");
run_perf_square(option_stats);
}
else if(ptr != NULL)
{
printf("Invalid Input! PLease enter a positive integer between 1
and 1000000\n");
run_perf_square(option_stats);
}
else
{
perfect_squares(option_stats, num);
}
}
}
谁能帮助我朝正确的方向发展?显然错误是我的if(ptr!= NULL)条件,但据我所知它似乎是正确的。正如我所说,我已经看过以前类似的问题,并在答案中提出了建议,但这似乎对我没有用。因此,我认为最好根据自己的情况寻求帮助。
提前致谢!
你正在以错误的顺序检查strtol
的结果,首先检查ptr
,也不要检查ptr对NULL
,修改它并检查它是否指向NUL
('\0'
)字符串终止符。
if (*ptr == '\0') {
// this means all characters were parsed and converted to `long`
}
else {
// this means either no characters were parsed correctly in which
// case the return value is completely invalid
// or
// there was a partial parsing of a number to `long` which is returned
// and ptr points to the remaining string
}
num > 1000001
也需要是num > 1000000
num < 0
也需要是num < 1
您还可以通过一些重组和逻辑调整将if语句序列折叠为仅一个无效分支和一个okay分支。
OP希望避免直接回答....
验证整数输入
0
作为I / O的一部分吗? (建议不要)strtol()
是您进行重型转换提升的朋友。检查errno
应如何设置和测试。使用endptr
。它的值是否应该在之前设定。以后如何测试。它消耗领先的空间,是吗?它将文本转换为long
,但OP需要模糊的“整数”。Qapla“
函数strtol返回long int,这是一个带符号的值。我建议你使用另一个变量(entry_num),你可以测试<0,从而检测负数。
我还建议正则表达式可以测试数字和有效输入的字符串输入,或者你可以使用strtok和除数字之外的任何东西作为分隔符;-)或者你可以使用验证扫描输入字符串,如:
int validate_input ( char* input )
{
char *p = input;
if( !input ) return 0;
for( p=input; *p && (isdigit(*p) || iswhite(*p)); ++p )
{
}
if( *p ) return 0;
return 1;
}