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)。我还有一个扫描内部扫描为int。如果它不是ESC(ASCII 27),那么它将它放入一个数组并增加j的值。如果它是一个ESC,它(应该)会中断(退出循环)。之后,只打印j(或j-1)个数组项。 问题: j(和我也是)增加到10,即使在~i = 3或4时调用中断 在调用之后,Break应该退出for循环而不做任何事情,对吧?引自BeginnersBook.com:
它用于立即退出循环。当在循环内遇到break语句时,控件直接退出循环并且循环终止。无论何时在循环内使用,它都与if语句一起使用。
我的代码出了什么问题?提前谢谢。
答案 0 :(得分:4)
您已经顽皮,因为您没有检查scanf
的返回值,它将告诉您成功填充的变量数量。在您的情况下,您希望它为1表示已将某些内容读入变量read
。
如果您尝试传递\033
(ASCII编码的ESC),则scanf
将无法将其解析为int
。然后将保留read
的先前值(如果尚未将其设置为任何内容,则可以为您提供未定义的效果),read == 27
几乎肯定会0
。该行为可以解释您正在观察的输出。
如果scanf
失败,您可以尝试从流中读取char
,并检查它是否等于\033
。