将scanf替换为fgets后程序异常:输入跳过与随机符号输出求助
解决你的犯罪举报系统输入问题与随机符号输出问题
嘿,这俩问题都是C语言输入输出里的经典坑,我帮你拆解下:
一、printf连续输出不等待输入的原因与解决
你遇到的问题核心是输入缓冲区里残留的换行符搞的鬼。当你用scanf读取整数(比如incident_day这类数值)时,用户输入完数字后会按回车,scanf只会把数字读走,而回车产生的\n会留在输入缓冲区里。之后你调用fgets时,它会直接读取这个残留的\n,误以为用户已经输入了内容,所以直接跳过等待,程序继续往下执行,看起来就像printf没等输入就跑了。
解决方法有两种,选哪种看你的习惯:
在scanf后手动清理缓冲区
在每次用scanf读取数值后,加一段代码把缓冲区里的残留字符(包括换行)清掉:scanf("%d", &incident_day); // 清理缓冲区直到遇到换行符 while (getchar() != '\n');这样后续的
fgets就能正常等待用户输入了。统一用fgets读取输入,再用sscanf解析数值
这种方法更安全,避免混合使用scanf和fgets带来的缓冲区问题。比如读取日期:char input_buf[100]; // 先读整行输入 fgets(input_buf, sizeof(input_buf), stdin); // 从输入里解析出日、月、年 sscanf(input_buf, "%d %d %d", &incident_day, &incident_month, &incident_year);这样就不会有残留换行的问题了。
二、报告模块输出随机符号的原因与解决
这个问题几乎可以肯定是变量未初始化导致的。比如你定义了字符串数组(比如证人信息、案件描述这类字符数组),但没有给它初始化,内存里的垃圾数据就会被当成有效内容输出,表现为随机符号。
解决方法:
确保所有要输出的变量在使用前都完成初始化:
- 对于字符数组,定义时直接初始化:
char witness_name[50] = {0}; // 把数组所有元素初始化为空字符'\0' char incident_desc[200] = {0}; - 对于数值变量(比如你代码里的
contact_number等),如果可能没被赋值就输出,也要初始化为0:
这样即使后续没给变量赋值,输出的也是0或者空字符串,不会出现随机符号。long long int contact_number = 0;
小示例代码参考
给你一段简化的正确输入逻辑示例,你可以对照着改自己的代码:
#include <stdio.h> #include <string.h> int main() { int incident_day, incident_month, incident_year; char incident_desc[200] = {0}; long long contact_number = 0; // 用fgets+sscanf读取日期 printf("请输入案件日期(日 月 年):"); char input[100]; fgets(input, sizeof(input), stdin); sscanf(input, "%d %d %d", &incident_day, &incident_month, &incident_year); // 读取案件描述 printf("请输入案件描述:"); fgets(incident_desc, sizeof(incident_desc), stdin); // 去掉fgets读取的换行符(如果有的话) incident_desc[strcspn(incident_desc, "\n")] = '\0'; // 读取联系电话 printf("请输入联系电话:"); fgets(input, sizeof(input), stdin); sscanf(input, "%lld", &contact_number); // 输出报告(不会有随机符号) printf("\n=== 案件报告 ===\n"); printf("日期:%d/%d/%d\n", incident_day, incident_month, incident_year); printf("描述:%s\n", incident_desc); printf("联系电话:%lld\n", contact_number); return 0; }
内容的提问来源于stack exchange,提问作者user9696504
相关产品推荐
相关产品推荐

