【发布时间】:2014-12-18 06:20:21
【问题描述】:
我有这个 c 程序,我在其中输入一个数字 N,然后再输入 N 个数字。例如,我将输入 100,然后再输入 100 个数字。出于某种原因,经过这么多输入后,scanf 函数将停止正常工作。就好像它已经停止接受输入,只会继续输入 size 中的任何值。
我想出的用例是 100 1 2 3 4 5 6 7 8 9 10...(重复十次)。然后在三四次之后,我将输入 100 10 9 8 7 6 5 4 3 2 1...(重复十次),然后就会出现打印语句的无限循环。
int main(int argc, const char * argv[]) {
int histogram[10000];
int i;
while (1) {
int *rectPtr = histogram;
int size;
scanf("%d", &size);
if (!size) return 0;
for (i = 0; i < size; ++i) {
scanf("%d", rectPtr);
rectPtr++;
}
printf("%d", 1);
printf("\n");
}
return 0;
}
【问题讨论】:
-
看这里的诀窍。
if (!size) return 0;。当它再次询问元素数量时,您是否尝试在输入循环元素后放置一次0?请注意,它在while(1)循环中。 -
你没有测试来自
scanf()的返回值,所以你不知道它是否有效。这对printf()语句很奇怪;为什么不写printf("%d\n", 1);甚至puts("1");? -
@JonathanLeffler 你是什么意思?当然我知道它不起作用,因为我已经调试过了。双 printf 是不必要的。
-
澄清一下,在这里,您正在检查 input 值 suppossed 将被
scanf()扫描,但您错过了检查 @987654331scanf()本身的 @ 值。 -
您的代码没有测试或捕获来自
scanf()的返回值,所以您不知道scanf()是否报告了问题。作为一般规则,测试输入函数的返回值以确保您认为发生的事情确实发生了。您还可以在读取后打印出读取的值:if (scanf("%d", rectPtr) != 1) { fprintf(stderr, "scanf() failed\n"); return 1; } printf("--> %d\n", *rectPtr); rectPtr++;。同样输入size。也可以考虑if (size <= 0) return 0;。并且使用fgets()加上sscanf()可以更轻松地报告错误。