C中的输入无效

时间:2017-02-02 21:32:56

标签: c input error-handling

我必须编写一个程序,从stdin中读取整数并停止在EOF读取或者输入无效。当测试无效输入时,我收到一条消息,说明"分段故障(核心转储)"当输入无效时,如何退出循环?这是我的代码:

int main()
{
    int num, temp, x, j;
    int i = 0;
    int arr[ARRAY_MAX];

    while (scanf("%d", &num) != EOF)
    {
        arr[i] = num;
        i++;
    }

    for (x = 0; x < i; ++x)
    {
        for (j = x+1; j < i; ++j)
        {
            if (arr[j] < arr[x])
            {
                temp = arr[x];
                arr[x] = arr[j];
                arr[j] = temp;
            }
        }
    }

    printf("%d\n", arr[1]);

    return EXIT_SUCCESS;
}

1 个答案:

答案 0 :(得分:2)

因为无效输入scanf()将返回0而不是EOF,您必须正确检查scanf()的返回值,在这种情况下,对于有效输入,它应该是1

如果第一个值是无效输入,则scanf()将失败并且num将被取消初始化,从而在读取它时分配给数组元素时会导致未定义的行为。

while ((scanf("%d", &num) == 1) && (i < ARRAY_MAX))

是检查它的方法。

然而,分段错误似乎是因为您没有验证i不足以溢出数组。其中我也在上面的代码中修复了。