C语言结构体中无法输入带空格字符串的问题求助
解决C语言结构体中输入含空格姓名被截断的问题
你的问题出在**scanf("%s")的读取规则**:%s格式符会将空格、换行、制表符等空白字符视为输入结束标记,所以只能读取空格前的部分内容。下面提供两种可靠的解决方法:
方法一:使用fgets读取整行姓名
fgets可以读取整行输入(包括空格),直到遇到换行符或达到指定长度。需要注意两个细节:
- 读取学生数量
n后,输入缓冲区会残留换行符,需先清空; fgets会把换行符也读入字符串,要手动去除。
修改后的核心代码片段:
printf("How many Students? : "); scanf("%d", &n); // 清空输入缓冲区残留的换行符 while (getchar() != '\n'); // ... 其他代码 ... printf("Enter Name : "); // 读取整行姓名,限制长度为name数组的大小 fgets(ptr->name, sizeof(ptr->name), stdin); // 去除字符串末尾的换行符 ptr->name[strcspn(ptr->name, "\n")] = '\0';
方法二:使用scanf的%[^\n]格式符
%[^\n]表示读取所有字符直到遇到换行符,配合前面的空格可以跳过缓冲区残留的空白字符。为了避免缓冲区溢出,要指定最大读取长度(name数组是30位,所以限制为29,留1位给字符串终止符\0)。
修改后的读取姓名代码:
printf("Enter Name : "); // 空格用于跳过之前的换行符,%29[^\n]限制读取29个字符直到换行 scanf(" %29[^\n]", ptr->name);
完整修改后的代码示例(使用fgets版本)
// mark list using struct #include <stdio.h> #include <string.h> struct mlist { char name[30]; int cs; int maths; int eng; int total; float perc; }; int main() { int n, i; printf("How many Students? : "); scanf("%d", &n); // 清空输入缓冲区的换行符 while (getchar() != '\n'); struct mlist std[n]; struct mlist *ptr = std; printf("Marks out of 100\n"); for (i = 0; i < n; i++) { printf("\n\nEnter details of Student %d ==>\n", i + 1); printf("Enter Name : "); fgets(ptr->name, sizeof(ptr->name), stdin); ptr->name[strcspn(ptr->name, "\n")] = '\0'; printf("Enter Computer Science Marks : "); scanf("%d", &ptr->cs); printf("Enter Mathematics Marks : "); scanf("%d", &ptr->maths); printf("Enter English Marks : "); scanf("%d", &ptr->eng); // 清空每次输入成绩后残留的换行符,避免影响下一次fgets while (getchar() != '\n'); ptr++; } ptr = std; for (i = 0; i < n; i++) { printf("\n---------------------------------\n"); printf("Name : %s\n", ptr->name); printf("Computer Science : %d\n", ptr->cs); printf("Mathematics : %d\n", ptr->maths); printf("English : %d\n", ptr->eng); ptr->total = ptr->cs + ptr->maths + ptr->eng; ptr->perc = (float)ptr->total / 300 * 100; printf("Total %d with %.2f%%\n", ptr->total, ptr->perc); ptr++; } return 0; }
注意:每次用scanf读取成绩后,也要清空缓冲区的换行符,否则下一次fgets会直接读取到这个换行符,导致姓名输入为空。
内容的提问来源于stack exchange,提问作者Ameen Aslam
相关产品推荐
相关产品推荐

