UVa在线判断ANSI C运行时错误与scanf但接受与sscanf结合使用

时间:2015-04-13 21:13:16

标签: c runtime scanf

我将省略整个代码,但到目前为止这些测试可能会非常令人不安:

这被ANSI C,C ++和C ++ 11接受

#include <stdio.h>
#include <stdlib.h>
int main()
{
    int p, q, r, s, t, u;
    char* str = malloc(1000);
    while(gets(str) != NULL) {
        sscanf(str, "%d %d %d %d %d %d", &p, &q, &r, &s, &t, &u);
        printf("%d %d %d %d %d %d\n", p, q, r, s, t, u);
    }
}

现在出现令人不安的事实,此代码在ANSI C中获得运行时错误,但在C ++和C ++ 11中被接受:

#include <stdio.h>
#include <stdlib.h>

int main()
{
    int p, q, r, s, t, u;
    //== 6 instead of != EOF also gives me a runtime error
    while(scanf("%d %d %d %d %d %d", &p, &q, &r, &s, &t, &u) != EOF) {
        printf("%d %d %d %d %d %d\n", p, q, r, s, t, u);
    }
}

1 个答案:

答案 0 :(得分:1)

您忘了return 0; - 在C中,这意味着main()会向shell返回垃圾状态。在C ++中,允许省略return 0;,并且将返回默认状态0(== EXIT_SUCCESS)。但是在C中,两个程序都将返回未定义的状态。在第一种情况下,你碰巧幸运,返回0。在第二种情况下,返回0以外的东西(可能是-1)。尝试并养成始终从main返回有效状态的习惯,无论您是否使用C或C ++。

有关详细信息,请参阅this excellent question and answer

另请注意,启用警告(例如gcc -Wall ...)进行编译会立即提醒您出现此错误,并为您节省了一些时间。