输入学生数量后scanf读取name自动跳过的问题解决咨询
在录入学生信息的C语言代码中,使用scanf输入学生数量后,后续读取姓名的scanf("%[^\n]")会直接跳过,进入学号输入环节;移除输入学生数量的scanf后代码可正常运行。推测原因是前一个scanf("%d")未读取输入后的换行符,该换行符被后续的%[^\n]格式语句读取,尝试过fgets和gets仍未解决。
问题代码如下:
#include <stdio.h> int b; int main() { int a, c; printf("Enter the number of students\n"); scanf("%d", &a); struct studinfo{ char name[50]; int roll; float marks; }; struct studinfo s[10]; for(int i = 0; i <= a; i++) { printf("Enter the Name :\n"); scanf("%[^\n]s", s[i].name); // 此处出现问题 printf("\n"); printf("Enter the roll no.\n"); scanf("%d", &s[i].roll); printf("\n"); printf("Enter the marks\n"); scanf("%f", &s[i].marks); } for(int i = 0; i<= a; i++) { printf("Name: %s\n", s[i].name); printf("Roll no: %d\n", s[i].roll); printf("Marks: %f", s[i].marks); } return 0; }
解决方案
清理输入缓冲区残留的换行符
在读取学生数量的scanf("%d", &a);语句后,添加getchar();来吃掉输入数字后留下的换行符。或者修改读取姓名的scanf语句,在格式串前加一个空格:scanf(" %[^\n]", s[i].name);——空格会让scanf自动跳过所有空白字符(包括换行、空格、制表符),避免读取到残留的换行符。修正
scanf格式串的错误
原代码中scanf("%[^\n]s", s[i].name);多了一个多余的s,正确的格式应该是scanf("%[^\n]", s[i].name);,因为%[^\n]本身就定义了读取直到换行符的字符串规则,不需要额外加s。修正循环条件避免数组越界
原代码中循环条件i <= a会导致处理a+1个学生(比如输入a=2,循环执行0、1、2三次),而数组s只定义了10个元素,若a>=10会直接越界崩溃。应该改为i < a,确保只处理a个学生。如果用
fgets替代scanf读取姓名
使用fgets读取姓名后,需要手动去除末尾的换行符,示例代码:fgets(s[i].name, sizeof(s[i].name), stdin); // 去掉换行符 s[i].name[strcspn(s[i].name, "\n")] = '\0';注意使用
fgets前同样需要清理缓冲区的残留换行符,否则fgets会直接读取到空行。
内容的提问来源于stack exchange,提问作者hmmm Mm

