输入残留换行符致程序跳过驾驶员姓名输入问题排查
输入异常问题:跳过姓名输入直接进入驾照号码环节
程序循环调用func1时,驾驶员2、3的姓名输入步骤会被直接跳过,直接进入驾照号码输入环节。你推测的原因完全正确——之前scanf输入整数后,输入缓冲区中残留的换行符(按下Enter产生)被后续的gets读取,导致姓名输入被直接跳过。
问题代码
void func1(char name[], int *lic, int *km) { printf("Enter your name:- "); gets(name); printf("Enter your license no.:- "); scanf("%d", lic); printf("Enter number of kilometers driven:- "); scanf("%d", km); }
问题根源
scanf("%d", lic)和scanf("%d", km)只会读取输入的整数部分,按下Enter产生的换行符会留在输入缓冲区中。当下一次调用func1时,gets(name)会直接读取这个残留的换行符,认为已经完成了姓名输入,直接跳过姓名提示环节。另外,gets函数已被C标准废弃,它不检查输入长度,极易导致缓冲区溢出,安全性极差。
解决方案
这里提供两种可靠的修改方案:
方案1:用fgets替代gets并清理缓冲区
#include <string.h> // 需要包含strcspn的头文件 void func1(char name[], int *lic, int *km) { printf("Enter your name:- "); fgets(name, sizeof(name), stdin); // 安全读取字符串,限制长度 name[strcspn(name, " ")] = '\0'; // 去掉fgets读取的换行符 printf("Enter your license no.:- "); scanf("%d", lic); getchar(); // 吃掉缓冲区残留的换行符 printf("Enter number of kilometers driven:- "); scanf("%d", km); getchar(); // 吃掉缓冲区残留的换行符 }
方案2:统一用scanf读取所有输入
void func1(char name[], int *lic, int *km) { printf("Enter your name:- "); scanf("%20[^ ]", name); // 限制读取20个字符(需保证name数组长度≥21) getchar(); // 吃掉换行符 printf("Enter your license no.:- "); scanf("%d", lic); getchar(); // 吃掉换行符 printf("Enter number of kilometers driven:- "); scanf("%d", km); }
内容的提问来源于stack exchange,提问作者World Travellzzz
相关产品推荐
相关产品推荐

