C语言混用gets()与scanf()导致输入跳过问题如何排查解决?
问题核心原因
scanf("%d")读取整数时仅消费输入缓冲区中的数字字符,用户输入完成后按下的换行符\n会残留在缓冲区中- 后续调用的
gets()函数遇到换行符会直接判定为输入结束,读取到空字符串,表现为输入项被跳过 - 额外提醒:
gets()函数已被C标准完全废弃,该函数不做输入长度校验,极易触发缓冲区溢出漏洞,存在严重安全风险,必须替换为fgets()
修复方案
- 每次调用
scanf()后手动清空输入缓冲区的残留内容,避免下一次读取字符串时读到空内容 - 用
fgets()替代gets(),如果不需要字符串末尾保留换行符可手动清除
修复后完整代码
#include <stdio.h> #include <string.h> struct driver { char drivername[500]; int license; char route[500]; int kilometers; }; // 清空输入缓冲区工具函数 void clear_input_buffer() { int c; while ((c = getchar()) != '\n' && c != EOF); } int main() { struct driver Driver1; printf("Driver 1 enter your details\n"); printf("Enter your name \n"); // 替换gets为fgets,参数分别为缓冲区地址、缓冲区长度、输入流 fgets(Driver1.drivername, sizeof(Driver1.drivername), stdin); // 去掉fgets读取到的末尾换行符 Driver1.drivername[strcspn(Driver1.drivername, "\n")] = '\0'; printf("Enter your license number \n"); scanf("%d", &Driver1.license); // 清空scanf残留的换行 clear_input_buffer(); printf("Enter the route on which you travel on \n"); fgets(Driver1.route, sizeof(Driver1.route), stdin); Driver1.route[strcspn(Driver1.route, "\n")] = '\0'; printf("Enter the number of kilometers travelled with the company \n"); scanf("%d" , &Driver1.kilometers); clear_input_buffer(); printf("司机姓名:%s\n", Driver1.drivername); printf("行驶路线:%s\n", Driver1.route); printf("驾照号码:%d\n", Driver1.license); printf("行驶公里数:%d\n", Driver1.kilometers); return 0; }
内容的提问来源于stack exchange,提问作者Chetxn04
相关产品推荐
相关产品推荐

