c - C 中的无效输入

标签 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;
}

最佳答案

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

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

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

是检查的方法。

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

关于c - C 中的无效输入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42012677/

相关文章:

c - strtok 在这种情况下到底是如何工作的?

javascript - 删除从输入 js 创建的缩略图

javascript - 限制输入字段实时预览中显示的字符数

error-handling - 为什么xforms-submit-error事件属性始终为空?

c - 为什么 #define 指令在使用数组时不起作用

c - 魔法风云卡抽奖概率函数C语言

javascript - 获取 2 个输入字段中的舍入值,这些值会在其中之一更新时更新

error-handling - NestJS - 如何构建代码以优雅地处理错误?

ruby-on-rails -/未定义方法 `page_media'中的NoMethodError为nil :NilClass

c - 字符串之间有空格