不是 c 中结构的预期结果循环
Not an Expected Result Loop of a Structure in c
我正在编写一个简单的 C 程序,该程序用于创建结构的循环。
所以我有一个 Students
的结构,其中包含姓名、年龄和年级。
所以输出将是这样的:
Enter name of student 1:
Enter age of student 1:
Enter Grade of student 1:
Enter name of student 2:
Enter age of student 2:
Enter Grade of student 2:
但是在我输入学生 1 的成绩后,它跳过了学生 2 的名字,所以我得到了这个:
Enter name of student 1:
Enter age of student 1:
Enter Grade of student 1:
Enter name of student 2: Enter age of student 2:
我正在使用 DevC++,这是我的代码:
#include <stdio.h>
struct student {
char name[50]; // declare name using array
int age;
int grade;
};
int main ()
{
struct student info[3]; //declare 3 students [3]
int i;
for(i=1;i<=3;i++) { // this is for the looping, student 1, student 2, student 3
printf("Enter name for student %d : ",i);
scanf("%s",info[i].name); // called struct using "." (dot)
printf("Enter age for sudent %d : ",i);
scanf("%d",&info[i].age);
printf("Enter grade for student %d : ",i);
scanf("%d",&info[i].grade);
}
return 0;
}
有人能找出我的代码有什么问题吗?或者请大家帮忙提个解决这个问题的建议,以获得预期的结果。
我试过你的代码并成功运行,我试着将它与你所做的进行比较。
结果是你声明scanf("%d",&info[i].grade);
收到一个 整数 输入。但是当我看到你的图片时,你的输入是 Character
所以只需在 Enter grade for student i
上用整数更改您的输入
您的代码的多项建议:
当使用scanf
输入数据时,请始终检查其return值以确保正确输入了足够的数据,例如,当您为[=14]输入B
时=] 字段,它 return 是零而不是一个:
int r = scanf("%d", &info[i].grade);
printf("%d\n", r); // 0
也如评论中所说,当你输入字符串时,请尝试使用fgets
,因为它更安全并且不会在空格处停止。 scanf
不检查缓冲区溢出。
此外,在您的 for
循环中,您正在访问数组 info
的边界,您必须从 0
.
开始
尝试以下操作:
int main ()
{
struct student info[3]; //declare 3 students [3]
int i;
int r;
for(i=0; i < 3; i++) {
printf("Enter name for student %d : ",i);
fgets(info[i].name, 50, stdin);
printf("Enter age for sudent %d : ",i);
r = scanf("%d", &info[i].age);
if (r < 1) {
printf("input error, exiting\n");
return 1;
}
printf("Enter grade for student %d : ",i);
r = scanf("%d", &info[i].grade);
if (r < 1) {
printf("input error, retry\n");
return 1;
}
}
return 0;
}
扩展 :(不错,顺便说一句!)
当您在 scanf 调用中输入非数字时,
printf("Enter grade for student %d : ",i);
scanf 将无法读取输入(请参阅 hyde 的评论,谢谢)
scanf 将跳过所有与提供的输入模式不匹配的输入,直到它到达换行符。任何未匹配读取的内容都保留在输入缓冲区中.因此,对 scanf 的后续调用从先前的输入中接收旧内容,在这种情况下确实匹配。
等级是 int 但你输入 char ('B',就像 8 :D),我修改三行:
#include <stdio.h>
struct student {
char name[50]; // declare name using array
int age;
char grade; // int -> char
};
int main ()
{
struct student info[3]; //declare 3 students [3]
int i;
for(i=1;i<=3;i++) { // this is for the looping, student 1, student 2, student 3
printf("Enter name for student %d : ",i);
scanf("%s",info[i].name); // called struct using "." (dot)
printf("Enter age for sudent %d : ",i);
scanf("%d",&info[i].age);
getchar(); // reade '\n' after type age
printf("Enter grade for student %d : ",i);
scanf("%c",&info[i].grade); // %d -> %c
}
return 0;
}
我正在编写一个简单的 C 程序,该程序用于创建结构的循环。
所以我有一个 Students
的结构,其中包含姓名、年龄和年级。
所以输出将是这样的:
Enter name of student 1:
Enter age of student 1:
Enter Grade of student 1:
Enter name of student 2:
Enter age of student 2:
Enter Grade of student 2:
但是在我输入学生 1 的成绩后,它跳过了学生 2 的名字,所以我得到了这个:
Enter name of student 1:
Enter age of student 1:
Enter Grade of student 1:
Enter name of student 2: Enter age of student 2:
我正在使用 DevC++,这是我的代码:
#include <stdio.h>
struct student {
char name[50]; // declare name using array
int age;
int grade;
};
int main ()
{
struct student info[3]; //declare 3 students [3]
int i;
for(i=1;i<=3;i++) { // this is for the looping, student 1, student 2, student 3
printf("Enter name for student %d : ",i);
scanf("%s",info[i].name); // called struct using "." (dot)
printf("Enter age for sudent %d : ",i);
scanf("%d",&info[i].age);
printf("Enter grade for student %d : ",i);
scanf("%d",&info[i].grade);
}
return 0;
}
有人能找出我的代码有什么问题吗?或者请大家帮忙提个解决这个问题的建议,以获得预期的结果。
我试过你的代码并成功运行,我试着将它与你所做的进行比较。
结果是你声明scanf("%d",&info[i].grade);
收到一个 整数 输入。但是当我看到你的图片时,你的输入是 Character
所以只需在 Enter grade for student i
您的代码的多项建议:
当使用scanf
输入数据时,请始终检查其return值以确保正确输入了足够的数据,例如,当您为[=14]输入B
时=] 字段,它 return 是零而不是一个:
int r = scanf("%d", &info[i].grade);
printf("%d\n", r); // 0
也如评论中所说,当你输入字符串时,请尝试使用fgets
,因为它更安全并且不会在空格处停止。 scanf
不检查缓冲区溢出。
此外,在您的 for
循环中,您正在访问数组 info
的边界,您必须从 0
.
尝试以下操作:
int main ()
{
struct student info[3]; //declare 3 students [3]
int i;
int r;
for(i=0; i < 3; i++) {
printf("Enter name for student %d : ",i);
fgets(info[i].name, 50, stdin);
printf("Enter age for sudent %d : ",i);
r = scanf("%d", &info[i].age);
if (r < 1) {
printf("input error, exiting\n");
return 1;
}
printf("Enter grade for student %d : ",i);
r = scanf("%d", &info[i].grade);
if (r < 1) {
printf("input error, retry\n");
return 1;
}
}
return 0;
}
扩展
当您在 scanf 调用中输入非数字时,
printf("Enter grade for student %d : ",i);
scanf 将无法读取输入(请参阅 hyde 的评论,谢谢)
scanf 将跳过所有与提供的输入模式不匹配的输入,直到它到达换行符。任何未匹配读取的内容都保留在输入缓冲区中.因此,对 scanf 的后续调用从先前的输入中接收旧内容,在这种情况下确实匹配。
等级是 int 但你输入 char ('B',就像 8 :D),我修改三行:
#include <stdio.h>
struct student {
char name[50]; // declare name using array
int age;
char grade; // int -> char
};
int main ()
{
struct student info[3]; //declare 3 students [3]
int i;
for(i=1;i<=3;i++) { // this is for the looping, student 1, student 2, student 3
printf("Enter name for student %d : ",i);
scanf("%s",info[i].name); // called struct using "." (dot)
printf("Enter age for sudent %d : ",i);
scanf("%d",&info[i].age);
getchar(); // reade '\n' after type age
printf("Enter grade for student %d : ",i);
scanf("%c",&info[i].grade); // %d -> %c
}
return 0;
}