You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C语言结构体中std[i].name无法读取含空格字符串的问题求助

解决C语言结构体数组中输入带空格字符串的问题

问题原因

输入带空格姓名失败的核心问题是:读取学号的scanf("%d")执行后,输入缓冲区中会残留一个换行符(按下回车确认学号时输入的)。后续的scanf("%[^\n]", std[i].name)会把这个残留的换行符当作输入内容,直接结束读取,导致姓名输入被跳过,程序直接进入年龄输入环节。

另外,你的代码里结构体定义存在语法错误,struct student后缺少{,需要补上。


修复方案

方案1:修改scanf格式控制符

在读取姓名的scanf格式控制符前添加一个空格,这个空格会自动跳过所有空白字符(包括换行、空格、制表符),就能正确读取带空格的姓名:

printf("\n\tEnter name:"); 
scanf(" %[^\n]", std[i].name); // 注意%符号前的空格

方案2:使用fgets读取整行输入

fgets可以直接读取包含空格的整行内容,不过需要手动处理可能读取到的换行符:

printf("\n\tEnter name:"); 
getchar(); // 先吃掉之前残留的换行符
fgets(std[i].name, sizeof(std[i].name), stdin);
// 去掉fgets读取到的末尾换行符
size_t name_len = strlen(std[i].name);
if (name_len > 0 && std[i].name[name_len - 1] == '\n') {
    std[i].name[name_len - 1] = '\0';
}

完整修正代码

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int main() {
    struct student {
        int roll;
        char name[30];
        int age;
    } std[3];

    for(int i = 0; i < 3; i++){
        int j = i + 1;
        printf("\nStudent%d\n\tEnter Roll:", j);
        scanf("%d", &std[i].roll);
        
        printf("\n\tEnter name:"); 
        scanf(" %[^\n]", std[i].name); // 修复后的姓名读取语句
        
        printf("\n\tEnter age:");
        scanf("%d", &std[i].age);
    }

    for(int i = 0; i < 3; i++){
        int j = i + 1;
        printf("\n student%d\n\tRoll:%d", j, std[i].roll);
        printf("\n\t name:%s", std[i].name);
        printf("\n\t age:%d", std[i].age);
    }
    return 0;
}

内容的提问来源于stack exchange,提问作者Mustafejur Rahman

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 02:25:23