为什么代码在c中以如此奇怪的顺序执行?

时间:2016-01-27 16:22:37

标签: 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 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终止符?并且..好吧,为什么如果条件执行后呢?

2 个答案:

答案 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