【发布时间】:2012-04-07 00:38:57
【问题描述】:
所以我得到了以下代码:
int q, x, y;
char l;
for (q = 0; q<10; q+=1) {
printf("%d\n", q);
if (3 == scanf("%c %d %d", &l, &x, &y)) {
printf("%d\n", q);
}
}
我希望这会运行“scanf”10 次。每次在我输入任何内容之前它都会打印“q”,然后再打印一次。所以预期的输出应该是这样的(如果我错了,请纠正我):
0
> a 1 1
0
1
> b 2 2
1
2
> c 3 3
2
...and so on.
但我真的明白了。
0
> a 1 1
1
1
2
> a 2 2
3
3
4
> a 3 3
5
5
6
> a 4 4
7
7
8
> a 5 5
9
9
如果我取出 scanf 函数,它按预期从 0-9 计数。 scanf 函数发生了什么使 for 循环行为如此怪异?我在 Java/Python 方面有一些经验,但我对 C 完全陌生。
根据您的 cmets 编辑代码至此(对奇怪的格式表示歉意):
for (q = 0; q<10; q+=1) {
printf("%d: ", q);
if (3 == scanf("%c %d %d ", &c, &x, &y)) printf("%d\n", q);
else { printf("WTF %d\n", q); }
}
一半解决了问题。它适用于除第一个迭代之外的所有迭代。因此:
0: a 0 0
WTF 0
1: b 1 1
1
2: c 2 2
2
那里发生了什么?第一行上方还有其他输出代码,来自程序的另一部分。会不会是这个原因?
【问题讨论】:
-
获取输入应始终通过 fgets+sscanf 完成,以避免此类和其他常见错误和漏洞。
-
这是一个 uni 作业,不幸的是我们不得不使用 scanf。
-
While-loop ignores scanf the second time 的可能重复项。在提问之前尝试搜索此网站。