c - 在 C 编程中检索数组值。我该如何修复这些错误?

标签 c arrays

这是我的第一篇文章,所以如果我没有正确地做到这一点,我很抱歉。但是,我对 C 编程相当陌生,并且遇到了障碍。我们获得了一个 .exe 文件来从头开始构建代码。我已经走到这一步了,但我在检索名字时遇到了困难。它正在存储它们,或者看起来是这样,但是当我将值设置为 3 时,它会从所有三个名称中获取前两个名称,并且只正确显示第三个名称。姓氏始终是正确的。我在下面提供了一张屏幕截图,显示了我的问题。我已经快完成了,但无法跨过这一步。任何帮助将非常感激!

#include <stdio.h>
#include <string.h>


int a_delete;
char b[100]; 
int name;
int counter=0;
int F;
int d;
int grade;
int set;
int w;
int x;
int z;
char a[100];
char names[100];
char g[100];
char h[100];
char i[100];
char c[100];
char f[100];
char phy[100];
char Counter[100];
char final_grade[100];
double class_grades[100];
double total;
double totals;

int main()
{



    printf("\n Welcome to the grade calculator");
    printf("\n Enter the total number of students in the class:");
    fgets(a, sizeof(a), stdin);
    sscanf(a, "%d", &name);
    char my_data[name*3];
    char my_array[name];

    if(name<1)
    {
        printf("\n Not a valid number");
        printf("\n Please enter a valid integer number only");
    }
            else
            {
                for(x=0;x<name;++x)
                {
                    printf("\n Please enter the students name:");
                    fgets(f, sizeof(f), stdin);
                    sscanf(f, "%s", &my_array[x]);

                }
                    if(x<=name)
                    {
                        for(x=0 ; x<name;++x)
                        {

                            printf("\n Please enter %s's Physics score (out     of 100 points)  : ", &my_array[x]);
                            fgets(b, sizeof(b), stdin);
                            sscanf(b, "%d", &my_data[set]);

                        }

                            for(x=0;x<name;++x)
                            {

                                printf("\n Please enter %s's Chemestry score (out of 100 points)  : ", &my_array[x]);
                                fgets(c, sizeof(c), stdin);
                                sscanf(c, "%d", &my_data[set]);

                            }
                                for(x=0; x<name;++x)
                                {


                                    printf("\n Please enter %s's Math score     (out of 100 points)  : ", &my_array[x]);
                                    fgets(g, sizeof(g), stdin);
                                    sscanf(g, "%c", &my_data[set]);

                                }
                                    if(x=3)
                                    {
                                        for(x=0; x<=name;++x)
                                        {
                                            puts("\n*****************");
                                            puts("\n***Report card***");
                                            puts("\n*****************");

                                            printf("Name of the student: %c", my_array[name]);

                                            printf("\nPhysics: %.2f/100", my_data[set]);

                                            printf("\nChemistry: %.2f/100",     my_data[set] );

                                            printf("\nMath: %.2f/100", my_data[set] );


                                                if(grade>=270)
                                                {

                                                    printf("\nYour letter grade: A");

                                                }
                                                        else if(my_data[set]<270>=240)
                                                        {
                                                            printf("\nYour letter grade: B");
                                                        }
                                                            else if(my_data[set]<240>=210)
                                                            {
                                                                printf("\nYour letter grade: C");
                                                            }
                                                                else if(my_data[set]<210>=180)
                                                                {
                                                                    printf("\nYour letter grade: D");
                                                                }
                                                                    else if(my_data[set]<180)
                                                                    {
                                                                        printf("\nYour letter grade: F");
                                                                    }

                                        }
            }
    }                               }

    return(0);

}

最佳答案

您将名称存储在同一个变量中,每次输入时都会覆盖最后一个。您似乎对 char 数组有误解,我将分解问题代码。

for(x=0;x<name;++x)
{
    printf("\n Please enter the students name:");
    fgets(f, sizeof(f), stdin);
    sscanf(f, "%s", &my_array[x]);
}
  1. 第一行表示“从 0 开始,x 加 1,直到 x 不小于 name”。 x 是您用于在数组中移动的变量,并且您一次移动 1 个字符。
  2. 跳到 fgets(),您将从用户那里读取一个字符串,并将其存储在 f 中。
  3. 最后,sscanf() 将字符串复制到 &my_array[x] 中。这是代码的问题部分。在这里,您将用户刚刚输入的数据复制到 my_array 中,从位置 x 开始。

对于您的示例输入,如下所示:

  1. 当 x == 0 时,my_array == { 's', 'a', 'm', '\0' }
  2. my_array == { 's', 'd', 'e', 'a', 'n', '\0' } 当 x == 1
  3. my_array == { 's', 'd', 'b', 'o', 'b', 'b', 'y', '\0' } 当 x == 2

请注意,它一次向右移动一个字符,这是 x 被添加到每个循环中。 char 仅包含单个字符,它与字符串或 char 数组不同。您可能想做的是这样的:

for(x=0;x<name;++x)
{
    printf("\n Please enter the students name:");
    fgets(f, sizeof(f), stdin);
    sscanf(f, "%s", &my_array[x*100]);
}

此外,当您定义 my_array 和其他一些变量时,您的大小非常模糊。请注意,当您定义 my_array 并输入 3 时,您仅为其提供了 3 个字符的写入空间。之后的任何事情都是未定义的行为,但基本上它会开始将数据放在您可能不想要或期望的地方。您还应该初始化该数组,如下所示:

char my_array[100*name];

希望这个答案能为您解决一些问题。我建议你对 c 中的原始数据类型和数组进行一些研究。解决您的问题的另一种可能的解决方案是实现二维数组。

关于c - 在 C 编程中检索数组值。我该如何修复这些错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40142329/

相关文章:

javascript - 直接插入的数组长度

c - 这个 IF-ELSE 中的条件有什么问题?

c - C中的结构体和指针

c - 使用c实现rsa加密解密

python - 排序 np 数组与 python 列表会产生不同的结果

c - 使用指向 char 数组的指针获取要使用 strstr() 复制的字符串的长度

ruby - 将方法应用于数组/可枚举中的每个元素

php - 用php忽略隐藏文件

php - PHP字符串索引数组如何在C++中高效实现

c - 设置定时器中断 1Hz、2Hz...并以它的方式完成所有工作意味着一种原始的 RTOS?