为什么代码在c中以如此奇怪的顺序执行?
输出:为什么代码在c中以如此奇怪的顺序执行?,c,fgets,C,Fgets,输出: 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 execu
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;
}
为什么在返回之前通过isdigit
处理空终止符?和。。好的,为什么条件在它之后执行
为什么在返回之前通过isdigit
处理空终止符
事实并非如此。它针对由fgets
读取的'\n'
字符执行
C11-§7.21.7.2
fgets
函数从流所指向的流
读取到s
所指向的数组中的字符数最多比n
指定的字符数少一个在新行字符(保留)之后或文件结尾之后不读取其他字符。在读取到数组中的最后一个字符后立即写入空字符
输入
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!
里面有5个字符
101
\n
当然不是数字
您还需要为\n
添加一个条件
101\n\0
使用scanf(“%d”和&char[i]
)获取输入。由于fgets
也接受换行符,这是您得到的额外输出,fgets
检查“\n”
,所以您的意思是我的输入字符串末尾有两个符号<代码>'\n'
和'\0'
?scanf
不合适,因为我必须对输入执行深度验证。
if (input[i] == '\0' || input[i] == '\n')
{
printf("stop executing is_valid()");
return 0;
}