You need to enable JavaScript to run this app. C语言结构体数组中strcmp函数匹配字符串失效是什么原因?
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.21 19:36:08