You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

将scanf替换为fgets后程序异常:输入跳过与随机符号输出求助

解决你的犯罪举报系统输入问题与随机符号输出问题

嘿,这俩问题都是C语言输入输出里的经典坑,我帮你拆解下:

一、printf连续输出不等待输入的原因与解决

你遇到的问题核心是输入缓冲区里残留的换行符搞的鬼。当你用scanf读取整数(比如incident_day这类数值)时,用户输入完数字后会按回车,scanf只会把数字读走,而回车产生的\n会留在输入缓冲区里。之后你调用fgets时,它会直接读取这个残留的\n,误以为用户已经输入了内容,所以直接跳过等待,程序继续往下执行,看起来就像printf没等输入就跑了。

解决方法有两种,选哪种看你的习惯:

  1. 在scanf后手动清理缓冲区
    在每次用scanf读取数值后,加一段代码把缓冲区里的残留字符(包括换行)清掉:

    scanf("%d", &incident_day);
    // 清理缓冲区直到遇到换行符
    while (getchar() != '\n');
    

    这样后续的fgets就能正常等待用户输入了。

  2. 统一用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:
    long long int contact_number = 0;
    
    这样即使后续没给变量赋值,输出的也是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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 08:20:37