这是我的第一篇文章,所以如果我没有正确地做到这一点,我很抱歉。但是,我对 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]);
}
- 第一行表示“从 0 开始,x 加 1,直到 x 不小于 name”。 x 是您用于在数组中移动的变量,并且您一次移动 1 个字符。
- 跳到 fgets(),您将从用户那里读取一个字符串,并将其存储在 f 中。
- 最后,sscanf() 将字符串复制到 &my_array[x] 中。这是代码的问题部分。在这里,您将用户刚刚输入的数据复制到 my_array 中,从位置 x 开始。
对于您的示例输入,如下所示:
- 当 x == 0 时,my_array == { 's', 'a', 'm', '\0' }
- my_array == { 's', 'd', 'e', 'a', 'n', '\0' } 当 x == 1
- 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/