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

C语言用户输入写入输出文件时出现重复写入问题求助

解决C程序中输出内容重复写入的问题

嘿,我帮你揪出问题根源了!你的代码里有几个关键错误,直接导致了输出内容重复、乱码的情况,咱们一步步来修复:

问题分析与修复点

  • scanf的地址传递错误:
    你在使用scanf时给name、bday、animal加了&取地址符,但数组名本身就是指向数组首元素的指针,不需要额外取地址。错误写法scanf("%s", &name);会导致指针类型不匹配,引发内存访问异常,这是数据混乱的诱因之一。应该改成scanf("%s", name);。

  • 字符串缺少终止符导致内存越界:

    1. bday数组定义为char bday[8];,但MMDDYYYY格式是8个字符,C语言字符串需要额外的'\0'作为终止标记,所以bday的大小至少要设为9(char bday[9];)。否则输入8位日期后,没有空间存储终止符,会溢出到相邻的animal数组,导致内存数据混乱。
    2. initializedGameState是char initializedGameState[1];,你只赋值了'1'却没加'\0'。fputs会一直读取直到遇到'\0',这就会越界读取后续内存的垃圾数据,把不属于这个变量的内容也写入文件。
  • 可选但重要的输入长度限制:
    为了避免用户输入过长导致数组溢出,建议在scanf中限制输入长度,比如scanf("%19s", name);(给20位的name留一位存终止符),scanf("%8s", bday);(给9位的bday限制8位输入)。

修正后的完整代码

void firstTime(){ 
    char name[20], animal[30], bday[9]; // 调整bday大小为9位,容纳日期+终止符
    char initializedGameState[2]; // 调整为2位,存'1'和终止符
    initializedGameState[0] = '1';
    initializedGameState[1] = '\0'; // 手动添加字符串终止符

    printf("Hello and welcome to the program! Please complete this quick first time setup.\n"); 
    printf("Please enter your name:\n"); 
    scanf("%19s", name); // 移除&,限制输入长度
    printf("\nPlease enter your birthdate (formatted MMDDYYYY):\n"); 
    scanf("%8s", bday); // 移除&,限制8位输入
    printf("\nHello %s, please choose a favorite animal:\n", name); 
    scanf("%29s", animal); // 移除&,限制输入长度
    printf("\n"); 

    FILE *fp; 
    fp = fopen("persistence.txt", "w"); 
    if(fp == NULL) {
        printf("persistence.txt has failed to open.");
    } else{ 
        fputs(name, fp); 
        fputs("\n", fp); 
        fputs(bday, fp); 
        fputs("\n", fp); 
        fputs(animal, fp); 
        fputs("\n", fp); 
        fputs(initializedGameState, fp); 
        fputs("\n", fp); 
        fclose(fp); 
        printf("First time setup complete. Initializing Detox.me...\n"); 
        setGameState(1); 
    } 
}

修复效果

现在输入john、04011998、dog后,persistence.txt里的内容会完全符合你的预期:

john
04011998
dog
1

内容的提问来源于stack exchange,提问作者d827

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.06 15:52:33