我必须编写一个程序,从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;
}
答案 0 :(得分:2)
因为无效输入scanf()
将返回0
而不是EOF
,您必须正确检查scanf()
的返回值,在这种情况下,对于有效输入,它应该是1
。
如果第一个值是无效输入,则scanf()
将失败并且num
将被取消初始化,从而在读取它时分配给数组元素时会导致未定义的行为。
while ((scanf("%d", &num) == 1) && (i < ARRAY_MAX))
是检查它的方法。
然而,分段错误似乎是因为您没有验证i
不足以溢出数组。其中我也在上面的代码中修复了。