为什么在输入学生数据函数中,%c来写入&pstu[i].sex的值就不行?用%s就可以呢?结构体中char sex
不是单个字符吗?


为什么在输入学生数据函数中,%c来写入&pstu[i].sex的值就不行?用%s就可以呢?结构体中char sex
不是单个字符吗?


W77yyds 晚上好🌙🌙🌙
本答案参考ChatGPT-3.5
在输入学生数据函数中,%c和%s在读取字符的方式上是有区别的。
使用%c读取字符可以成功,但是会遇到问题:使用%c读取字符时会包括输入时留下的换行符(\n),这是因为%c会读取输入缓冲区中的一个字符,而换行符会被认为是一个可读取的字符。
使用%s读取字符串可以解决问题:使用%s读取字符串时,会读取输入缓冲区中的一个字符串,直到遇到空白字符(空格、制表符或换行符)为止,所以可以正常读取到为性别指定的字符。
解决方案:
使用%c读取性别字符时,需要在%c之前加一个空格,用于吸收输入缓冲区中的换行符,即scanf(" %c",&pstu[i].sex)
使用%s读取性别字符串时,需要保证输入的性别只有一个字符,否则可能会造成溢出,并且需要保证输入的性别字符和下一个需要读取的数据之间有空格,否则会出错。
修改后的代码如下:
#include<stdio.h>
#include<stdlib.h>
struct Student {
int age;
float score;
char sex;
};
void input(struct Student *pstu, int n);
int main() {
int num;
printf("请输入学生人数:");
scanf("%d", &num);
struct Student *pst = (struct Student*)malloc(sizeof(struct Student) * num);
input(pst, num);
return 0;
}
void input(struct Student *pstu, int n) {
for(int i = 0; i < n; i++) {
printf("请输入性别:");
scanf(" %c", &pstu[i].sex);
printf("请输入年龄:");
scanf("%d", &pstu[i].age);
printf("请输入成绩:");
scanf("%f", &pstu[i].score);
}
}
修改后的代码中将输入函数input的声明放在了结构体Student的后面,并对输入性别字符的部分进行了修改。