第4行,&s[i].name前面的取址符&去掉,然后如果需要输入一个中文到性别字段,需要将性别字段定义为字符数组。
修改如下:
参考链接:
#include <stdio.h>
struct student{
int no;
char name[20];
char sex[5]; // 如果需要存储中文到性别字段,需要将性别字典定义为字符数组,因为一个中文不止一个字符长度
int age;
}s[10];
int main(void){
int i;
int n=3; // 测试3个学生
for(i=0;i<n;i++){
// https://blog.csdn.net/KinglakeINC/article/details/114459168
// 因为姓名字段name为字符数组,所以前面的取址符去掉
// 将性别字段定义为字符数组后,使用%s读取性别字段,然后&s[i].sex前面的取址符&去掉
scanf("%d %s %s %d",&s[i].no,s[i].name,s[i].sex,&s[i].age);
}
for(i=0;i<n;i++){
// https://blog.csdn.net/KinglakeINC/article/details/114459168
// 将性别字段定义为字符数组后,使用%s打印性别字段
printf("%d %s %s %d\n",s[i].no,s[i].name,s[i].sex,s[i].age);
}
return 0;
}
你性别那个char变量没指定长度,一个中文字占两个英文字符的长度,超了
看一下这个:
#include <stdio.h>
#include <string.h>
// 定义学生结构体
struct Student {
char name[50];
int age;
char id[20];
};
int main() {
// 初始化10个学生的信息
struct Student students[10] = {
{"张三", 20, "20230001"},
{"李四", 21, "20230002"},
{"王五", 19, "20230003"},
{"赵六", 22, "20230004"},
{"孙七", 18, "20230005"},
{"周八", 23, "20230006"},
{"吴九", 24, "20230007"},
{"郑十", 25, "20230008"},
{"陈十一", 26, "20230009"},
{"肖十二", 27, "20230010"}
};
// 打印所有学生的信息
for (int i = 0; i < 10; i++) {
printf("Name: %s\n", students[i].name);
printf("Age: %d\n", students[i].age);
printf("ID: %s\n", students[i].id);
}
return 0;
}
【以下回答由 GPT 生成】
问题的原因在于在使用scanf函数读取姓名时,应该使用%s来读取一个字符串,而不是使用%s来读取字符数组。 此外,在使用scanf函数读取字符时,应该使用空格来跳过输入缓冲区中的空格和换行符。 下面是修改后的代码:
#include<stdio.h>
struct student {
int no;
char name[20];
char sex;
int age;
};
int main(void) {
struct student s[10];
int i;
int n = 10;
for (i = 0; i < n; i++) {
scanf("%d", &s[i].no);
scanf(" %s", s[i].name);
scanf(" %c", &s[i].sex);
scanf(" %d", &s[i].age);
}
for (i = 0; i < n; i++) {
printf("%d %s %c %d\n", s[i].no, s[i].name, s[i].sex, s[i].age);
}
return 0;
}
这样修改后的代码将能够正确存储学生的信息。
【相关推荐】