为什么我的程序接受一个太多的整数并输入太少?

时间:2015-06-14 16:31:55

标签: c arrays scanf

我想了解为什么程序允许我在将SIZE定义为2时输入3个整数。当它返回数组时,它只返回两个数字而不是我输入的三个数字。谢谢你的帮助

//C How to Program Exercises 2.23
#include <stdio.h>
#include <conio.h>
#define SIZE 2

int main (void){

    int myArray[SIZE];
    int count;
    printf("Please enter 5 integers\n");
    for (count=1;count<=SIZE;count++){
        scanf("%d\n",&myArray[count]);
    }
    for (count=1;count<=SIZE;count++){
        printf("The values of myArray are %d\n",myArray[count]);
    }
    getch();

    return 0;
}

3 个答案:

答案 0 :(得分:4)

你的循环应该是

for (count=0;count<SIZE;count++)

基于C。

的数组索引为0

由于您在\n调用中有一个空白聊天(scanf()),它会等待您输入非空白字符来完成每个调用。删除\n

   for (count=0;count<SIZE;count++){
    scanf("%d",&myArray[count]);
}

答案 1 :(得分:1)

C数组从0开始编制索引,而不是从1开始编制索引。 C不会自动对数组访问执行边界检查,实际上,您的代码格式正确。但是,它的运行时行为是 undefined ,因为它使用数组元素表达式在该数组的边界外写入,并且,由于它使用数组元素表达式在边界外读取那个阵列。

Inasmuchas程序肯定会在每次运行中表现出未定义的行为,绝对没有什么可以说它应该做什么。如果在实践中你观察输入循环迭代三次,那么可能的解释是第二次迭代会覆盖count变量的值。鉴于变量的声明顺序,这是游戏中未定义行为的合理表现。

另一方面,输出循环完全按照您告诉它的次数进行迭代:一次使用count == 1,另一次使用count == 2。鉴于程序执行的一般不确定性,这绝不是保证,但它是关于我能想到的最不令人惊讶的行为。

答案 2 :(得分:1)

  

为什么程序允许我输入3个整数

此循环恰好运行2次:

for (count=1;count<=SIZE;count++){
        scanf("%d\n",&myArray[count]);
    }

但是当您在\n中使用scanf()时,此scanf()会等到您提供任何空格。

Proper Input code:

for (count=0;count<SIZE;count++){
        scanf("%d",&myArray[count]);
    }
  

当它返回数组时,它只返回两个数字

您的原始输出代码正确打印了第一个数字,但您的第二个数字是垃圾值。

Proper Output Code:

for (count=0;count<SIZE;count++){
        printf("The values of myArray are %d\n",myArray[count]);
    }

所以完整代码是这样的:

//C How to Program Exercises 2.23
#include <stdio.h>
#include <conio.h>
#define SIZE 2

int main (void){

    int myArray[SIZE];
    int count;
    printf("Please enter 5 integers\n");
    for (count=0;count<SIZE;count++){
        scanf("%d",&myArray[count]);
    }
    for (count=0;count<SIZE;count++){
        printf("The values of myArray are %d\n",myArray[count]);
    }
    getch();

    return 0;
}