C for循环继续递增

时间:2018-02-05 16:43:39

标签: c arrays loops

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语句一起使用。

我的代码出了什么问题?提前谢谢。

1 个答案:

答案 0 :(得分:4)

您已经顽皮,因为您没有检查scanf返回值,它将告诉您成功填充的变量数量。在您的情况下,您希望它为1表示已将某些内容读入变量read

如果您尝试传递\033(ASCII编码的ESC),则scanf将无法将其解析为int。然后将保留read的先前值(如果尚未将其设置为任何内容,则可以为您提供未定义的效果),read == 27几乎肯定会0。该行为可以解释您正在观察的输出。

如果scanf 失败,您可以尝试从流中读取char,并检查它是否等于\033