使用指针实现的学生信息录入函数中姓名输入被跳过的问题求助
解决scanf读取姓名后跳过后续输入的问题(保留指针实现)
你的问题根源是输入缓冲区残留的换行符:当用scanf("%[^\n]s", ...)读取第一个学生姓名(输入后按回车),%[^\n]会读取换行符前的所有字符,但换行符\n会留在输入缓冲区。下一次循环执行scanf("%[^\n]s")时,这个换行符会被直接读取,%[^\n]遇到换行符就停止,导致姓名被读取为空,程序直接进入成绩输入环节。
另外注意:原代码中的%[^\n]s是错误写法,%[]是独立的格式说明符,不需要后缀s;同时必须添加长度限制,避免缓冲区溢出。
修复方案
1. 核心修改:修正scanf格式并清除缓冲区空白
在读取姓名的scanf格式字符串前添加一个空格(自动跳过所有空白字符,包括残留的换行),同时修正格式符并添加长度限制:
scanf(" %NAME_MAX[^\n]", *(pnames + i));
2. 完整修改后的insert_data函数(保留指针实现)
void insert_data(char (*pnames)[NAME_MAX], int (*pscore)[MAX_SCORES]) { int i, j; // 录入数据 for (i = 0; i < MAX_STUDENTS; i++){ printf("Enter student %d name:", i + 1); // 前置空格跳过空白,%NAME_MAX[^\n]限制读取长度防止溢出 scanf(" %NAME_MAX[^\n]", *(pnames + i)); for (j = 0; j < MAX_SCORES; j++) { printf("Enter student %d score: ", (i + 1)); scanf("%d", *(pscore + i) + j); printf("%d\n",*(*(pscore + i) + j) ); } } // 打印表格 for (i = 0; i < MAX_STUDENTS; i++) { printf("%s: \t\t",*(pnames + i)); for (j = 0; j < MAX_SCORES; j++) { printf("%d \t",*(*(pscore + i) + j)); } printf("\n"); } }
3. 关于fgets的补充说明
如果你之前尝试fgets未成功,是因为fgets会把换行符读入字符串,需要手动去除,同时也要先清除缓冲区残留的换行:
// 先清除缓冲区残留的换行 while (getchar() != '\n'); // 读取姓名 fgets(*(pnames + i), NAME_MAX, stdin); // 去掉字符串末尾的换行符 (*(pnames + i))[strcspn(*(pnames + i), "\n")] = '\0';
但此方案需要额外处理缓冲区,不如修改后的scanf贴合你原有的代码逻辑。
内容的提问来源于stack exchange,提问作者bursikif
相关产品推荐
相关产品推荐

