C for循环继续递增

e4eetjau  于 2023-03-22  发布在  其他
关注(0)|答案(1)|浏览(133)
  • 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语句一起使用,无论何时在循环中使用。
我的代码有什么问题?先谢谢你。

xnifntxz

xnifntxz1#

你不小心没有检查scanf的 * 返回值 *,它会告诉你成功填充的变量的数量。在你的例子中,你希望它是1,以表明有东西被读入了你的变量read
如果你试图传递\033(ASCII编码的ESC),那么scanf将无法将其解析为int。然后read的前一个值将被保留(如果它还没有被设置为任何值,这可能会给你带来未定义的效果),而read == 27几乎肯定会是0。这种行为解释了你所观察到的输出。
如果scanfdoes 失败,您可以尝试从流中阅读char,并检查它是否等于\033

相关问题