- Newb* 在这里。
我可能忽略了一些琐碎的东西,但是:事情是这样的http://i.imgur.com/8BmPci5.png
#include <stdio.h>
#include <stdlib.h>
int main()
{
//Sort Numbers (zuerst)
int numbers [10];
int i,j;
j = 0;
int read;
printf("Input numbers: \n");
for (i=0;i<10;i++) {
scanf("%d",&read);
if (read == 27) {
break;
} else {
numbers[i] = read;
j++;
}
}
printf("j is: %d, i is: %d\n", j, i);
for (i=0;i<j;i++) {
printf("numbers[%d] is: %d\n", i, numbers[i]);
}
return 0;
}
输出:
Input numbers:
1
2
3
^[
j is: 10, i is: 10
numbers[0] is: 1
numbers[1] is: 2
numbers[2] is: 3
numbers[3] is: 3
numbers[4] is: 3
numbers[5] is: 3
numbers[6] is: 3
numbers[7] is: 3
numbers[8] is: 3
numbers[9] is: 3
我有一个for循环(从0到〈10)。我还有一个scanf,里面扫描一个int。如果它不是ESC(ASCII 27),那么它把它放入一个数组,并递增j的值。如果它是一个ESC,它(应该)中断(退出循环)。后来,只有j(或j-1)个数组项目将被打印。问题:j(和i)递增到10,即使break在~ i = 3或4时被调用。
Break应该在for循环被调用后不做任何事情就退出for循环,对吗?BeginnersBook.com:
它用于立即从循环中出来。当在循环中遇到break语句时,控制直接从循环中出来,循环终止。它与if语句一起使用,无论何时在循环中使用。
我的代码有什么问题?先谢谢你。
1条答案
按热度按时间xnifntxz1#
你不小心没有检查
scanf
的 * 返回值 *,它会告诉你成功填充的变量的数量。在你的例子中,你希望它是1,以表明有东西被读入了你的变量read
。如果你试图传递
\033
(ASCII编码的ESC),那么scanf
将无法将其解析为int
。然后read
的前一个值将被保留(如果它还没有被设置为任何值,这可能会给你带来未定义的效果),而read == 27
几乎肯定会是0
。这种行为解释了你所观察到的输出。如果
scanf
does 失败,您可以尝试从流中阅读char
,并检查它是否等于\033
。