C语言用户输入写入输出文件时出现重复写入问题求助
解决C程序中输出内容重复写入的问题
嘿,我帮你揪出问题根源了!你的代码里有几个关键错误,直接导致了输出内容重复、乱码的情况,咱们一步步来修复:
问题分析与修复点
scanf的地址传递错误:
你在使用scanf时给name、bday、animal加了&取地址符,但数组名本身就是指向数组首元素的指针,不需要额外取地址。错误写法scanf("%s", &name);会导致指针类型不匹配,引发内存访问异常,这是数据混乱的诱因之一。应该改成scanf("%s", name);。字符串缺少终止符导致内存越界:
bday数组定义为char bday[8];,但MMDDYYYY格式是8个字符,C语言字符串需要额外的'\0'作为终止标记,所以bday的大小至少要设为9(char bday[9];)。否则输入8位日期后,没有空间存储终止符,会溢出到相邻的animal数组,导致内存数据混乱。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
相关产品推荐
相关产品推荐

