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
相关产品推荐
相关产品推荐

