被要求两次插入整数

时间:2017-11-15 18:08:33

标签: c

我有一些功课要做大学,因为我是初学者,我不知道如何编码。所以,有10个测试,每个测试的等级在0到10之间。我必须确保我没有得到任何负数或大于10的数字。在运行代码时我必须按顺序放2个数字进入下一个,当时,我显然只想要保存到A [i]的那个。我希望你能理解,即使我甚至无法解释这个问题。 :)

#include<stdio.h>

int main()
{
    int A[10]; 
    int i, j;
    for ( i = 1; i<11; i++)
    {
        printf("Enter %d grade \n", i);
        scanf("%d", &j);
        if (j<=10 && j>=0)
         A[i] = j;
        else
         printf("Enter a number between 0 and 10\n");
         scanf("%d", &j);
    }
}

6 个答案:

答案 0 :(得分:1)

为什么有2个输入?

你写的是什么

     else
     printf("Enter a number between 0 and 10\n");
     scanf("%d", &j);

相同
     else {
     printf("Enter a number between 0 and 10\n");
     }
     scanf("%d", &j);

你想要的是: -

    else {
     printf("Enter a number between 0 and 10\n");
     scanf("%d", &j);
    }

这是很早就讲的。很明显,即使您提供了正确的输入,也需要输入2个数字。

未定义的行为: -

此外,您在A有10个位置,为什么要写在A[10]。 C数组是0索引的。您正在处理未定义的行为。

for ( i = 0; i<10; i++)

逻辑错误?

当用户输入两次错误输入时会发生什么?您需要使用while循环。 (你不能指望所有用户第二次都是对的。)

Scanf返回一些东西......

检查scanf的返回类型,检查scanf来电是否符合您的预期。

我告诉你的其他部分将在循环变量中使用size_t

答案 1 :(得分:1)

在这种特殊情况下,添加大括号:

// V-- brace else { printf("Enter a number between 0 and 10\n"); scanf("%d", &j); } //^-- brace

解决您在邮件中描述的问题。没有大括号,只有else之后的第一件事是条件的一部分。因此,scanf始终被执行,无论数字是否在0到10之间。

我也同意其他答案---零索引和for循环边界很重要。 编辑具体来说,在C数组中,第一个元素是0.因此,最好将测试编号为0..9而不是1..10。您还应该将变量命名为它们,因此:

int which_test;
for (which_test = 0; which_test < 10; ++which_test) 

答案 2 :(得分:0)

数组从C的索引0开始,因此你的for循环应该是for(i=0;i<10;i++)

答案 3 :(得分:0)

data.(value)调用了未定义的行为,因为C不检查数组绑定。

C11 J.2未定义的行为

  
      
  • 将指针加到或减去数组对象和整数类型会产生一个指向超出范围的结果   数组对象,用作一元A[i] = j;运算符的操作数   被评估(6.5.6)。
  •   

数组*的代码大小为A个字节。因此,您可以存储数组元素0到9。

答案 4 :(得分:0)

也许这就是你要找的东西。你应该尝试使用do-while循环。

#include<stdio.h>

int main()
{
    int A[10]; 
    int i, j;
    for ( i = 0; i<10; i++)
    {
        do{
            printf("Enter %d grade \n", i+1);
            scanf("%d", &A[i]);
        }while(A[i]<0 || A[i]>10);
    }
}

答案 5 :(得分:0)

仔细观察:

    if (j<=10 && j>=0)
     A[i] = j;
    else
     printf("Enter a number between 0 and 10\n");
     scanf("%d", &j);

else子句周围没有大括号,因此只有else之后的第一个语句适用于它。以上内容与:

相同
    if (j<=10 && j>=0) {
     A[i] = j;
    } else {
     printf("Enter a number between 0 and 10\n");
    }
    scanf("%d", &j);

所以每次都会执行第二个scanf

始终在if / elseforwhile块周围添加大括号:

    if (j<=10 && j>=0) {
       A[i] = j;
    } else {
       printf("Enter a number between 0 and 10\n");
       scanf("%d", &j);
    }

此外,您的数组int A[10];总共有10个元素,索引范围从0到9.您的for循环使用1到10之间的索引,因此您最终写入的结尾超过了阵列。修复此问题以使用正确的索引:

for ( i = 0; i<10; i++)