int is_valid(char *input)
{
int i;
for (i = 0;; i++)
{
// Check for null terminator
if ( ! input[i])
{
printf("stop executing is_valid()");
return 0;
}
// Will be executed for null terminator... o_O
printf("%c isdigit: %d\n", input[i], isdigit(input[i]));
}
return 1;
}
int main()
{
char input[80];
fgets(input, sizeof(input), stdin);
is_valid(input);
return 0;
}
输出:
1 isdigit: 1
0 isdigit: 1
1 isdigit: 1
isdigit: 0 // Why is that here? null terminator after return?!
stop executing is_valid()invalid input!
为什么在返回之前通过isdigit
处理null终止符?并且..好吧,为什么如果条件执行后呢?
答案 0 :(得分:4)
为什么在返回之前通过
isdigit
处理null终止符?
不是。它由'\n'
读取的fgets
字符执行。
C11-§7.21.7.2
fgets
函数最多只读取一个小于n
指定的字符数,从stream
指向的流进入s
指向的数组。 在换行符(保留)或文件结束后不会读取其他字符。在读入数组的最后一个字符后立即写入空字符。
输入
101
其中有5
个字符
101\n\0
\n
当然不是数字。
您还需要为\n
添加条件
if (input[i] == '\0' || input[i] == '\n')
{
printf("stop executing is_valid()");
return 0;
}
答案 1 :(得分:1)
使用scanf("%d",&char[i]
)获取输入。由于fgets
也接受换行符操作符,这是您获得的额外输出,"\n"
检查fgets
。