C语言结构体数组中strcmp函数匹配字符串失效是什么原因?
问题根因
fgets()读取输入时会把用户按下回车产生的换行符\n也写入目标字符数组:当你输入M并回车后,s[i].Gender实际存储的是"M\n",和strcmp对比的目标字符串"M"不相等,因此匹配永远失败。- 分支判断逻辑错误:你写的两个
if是完全独立的分支,就算第一个if成功匹配到M并修改了Gender的值,第二个判断F的if必然不满足,会直接进入else分支触发报错,正确逻辑应该用if-else if串联判断。 - 额外注意:
fflush(stdin)属于C标准未定义行为,仅在部分Windows编译器下生效,跨平台场景会失效,不建议使用。
修正后的完整代码
#include<stdio.h> #include<string.h> struct student{ char name[50]; int Roll_No; char Gender[10]; }; int main() { int size; printf("Enter the size for number of students you want to store:"); scanf("%d",&size); // 清除scanf残留的换行符 while(getchar() != '\n'); struct student s[size]; int i; for(i=0;i<size;i++) { printf("Enter the name of student s[%d]:",i); fgets(s[i].name,50,stdin); // 移除姓名末尾的换行符,避免输出时多空行 int name_len = strlen(s[i].name); if(name_len > 0 && s[i].name[name_len-1] == '\n') { s[i].name[name_len-1] = '\0'; } printf("Enter the Roll Number of student s[%d]:",i); scanf("%d",&s[i].Roll_No); // 清除scanf残留的换行符 while(getchar() != '\n'); gen:printf("Enter your Gender(M-Male F-Female) for student s[%d]:",i); fgets(s[i].Gender,10,stdin); // 移除Gender末尾的换行符 int gen_len = strlen(s[i].Gender); if(gen_len > 0 && s[i].Gender[gen_len-1] == '\n') { s[i].Gender[gen_len-1] = '\0'; } if(strcmp(s[i].Gender,"M")==0) { strcpy(s[i].Gender,"Male"); } else if(strcmp(s[i].Gender,"F")==0) { strcpy(s[i].Gender,"Female"); } else { printf("Please enter correct value for Gender!!\n"); goto gen; } } printf("\nInformation entered of Students:\n"); for(i=0;i<size;i++) { printf("Name of student s[%d]:%s\n",i,s[i].name); printf("Roll Number of student s[%d]:%d\n",i,s[i].Roll_No); printf("Gender of student s[%d]:%s\n",i,s[i].Gender); } return 0; }
内容的提问来源于stack exchange,提问作者user15915509
相关产品推荐
相关产品推荐

