C 两次被要求插入整数

C 两次被要求插入整数,c,C,我有一些作业要为大学做,因为我是初学者,我还不知道如何编写代码。因此,有10个测试,每个测试的分数在0到10之间。我必须确保我没有得到任何负数或大于10的数字。在运行代码时,我必须输入2个数字,以便继续下一个数字,而我显然只希望将其中一个保存到[I]中。尽管我无法解释这个问题,但我希望你能理解 #include<stdio.h> int main() { int A[10]; int i, j; for ( i = 1; i<11; i++)

我有一些作业要为大学做,因为我是初学者,我还不知道如何编写代码。因此,有10个测试,每个测试的分数在0到10之间。我必须确保我没有得到任何负数或大于10的数字。在运行代码时,我必须输入2个数字,以便继续下一个数字,而我显然只希望将其中一个保存到[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);
    }
}

数组从C中的索引0开始,所以for循环应该是fori=0;iWhy 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个数字的原因

未定义的行为:- 此外,您在[10]中有10个位置。C数组是0索引的。您正在处理未定义的行为

for ( i = 0; i<10; i++)
逻辑错误? 当用户两次输入错误时会发生什么?您需要使用while循环。你不能指望所有的用户第二次都是对的

Scanf返回了一些东西。。。 检查scanf的返回类型,以检查scanf调用是否正在执行您期望它执行的操作


我将告诉您的其他位将在循环变量中使用size\u t。

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

//V形支架 否则{ 打印输入一个介于0和10之间的数字\n; 扫描%d,&j; } //^-支架

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

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

int which_test;
for (which_test = 0; which_test < 10; ++which_test) 
A[i]=j;调用了未定义的行为,因为C不检查数组绑定

C11 J.2未定义的行为

将指针加减到数组对象和整数类型中,或将指针加减到数组对象和整数类型的正上方,将生成指向正上方的结果 数组对象,用作一元*运算符的操作数 根据第6.5.6节进行评估。
在您的代码中,数组的大小是10*sizeofint字节。因此,您可以存储数组元素0到9。

也许这就是您要寻找的。您应该使用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);
    }
}
仔细看这里:

    if (j<=10 && j>=0)
     A[i] = j;
    else
     printf("Enter a number between 0 and 10\n");
     scanf("%d", &j);
因此,每次都会执行第二个scanf

始终在if/else、for和while块周围放置大括号:


超出对象边界写入的未定义行为。欢迎访问该站点!查看和,了解有关提问的更多信息,这些问题将吸引高质量的答案。您可以添加更多信息。欢迎使用堆栈溢出!关于一个不能再被复制的问题或者由一个简单的印刷错误引起的问题通常是离题的。虽然类似的问题可能在这里的主题,这是一个解决的方式不太可能帮助未来的读者。这通常可以通过在发布前识别并仔细检查重现问题所需的最短程序来避免。在这种情况下,这是一种从1到10而不是0到9的索引错误,并且缺少了else中块的大括号。数组是零索引的,这意味着a的第一个元素是[0],而不是[1]Wow,这很简单!非常感谢!本声明:whileA[i]10;表示如果用户输入的数字在0…10范围内,则退出循环。这不是OPs问题所要求的。@user3629249此条件表示,如果用户输入的值小于0或大于10,则继续输入特定的等级值,因为OP希望每个值的等级介于0和10之间,您的权利,我误解了OP在这个特定代码块上试图做什么。声明:在你的代码中,数组的大小是10字节。仅当int为一个字节时才为true。在现代CPU上,每个int是4或8字节32位或64位体系结构,因此数组A有10个条目,每个条目是4或8字节。因此,数组中的实际字节数是40或80,而不是10
    if (j<=10 && j>=0) {
     A[i] = j;
    } else {
     printf("Enter a number between 0 and 10\n");
    }
    scanf("%d", &j);
    if (j<=10 && j>=0) {
       A[i] = j;
    } else {
       printf("Enter a number between 0 and 10\n");
       scanf("%d", &j);
    }
for ( i = 0; i<10; i++)