Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/svg/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么代码在c中以如此奇怪的顺序执行?_C_Fgets - Fatal编程技术网

为什么代码在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;
}