C语言回文复制程序异常:回文仅打印未写入目标文件
问题:回文姓名仅打印到屏幕,无法写入目标文件
你的程序中,回文姓名能正常打印到屏幕,但无法写入目标文件的核心原因是存储姓名的字符数组y没有添加字符串结束符'\0',同时姓名读取逻辑存在边界问题,以下是具体分析和修复方案:
核心问题分析
fputs函数要求输入的是一个以'\0'结尾的C风格字符串。你的代码在读取姓名到y数组后,没有添加这个结束符,导致fputs会从y数组开始读取内存中的随机数据,直到遇到某个偶然的'\0',最终写入文件的内容要么乱码,要么看起来像是没有写入。
另外,原代码中while (m != ' ')的读取逻辑,在文件最后一个姓名后没有空格时,会一直读到EOF并越界写入y数组,引发未定义行为。
修复后的代码
#include <stdio.h> #include <stdlib.h> int main() { FILE *fp, *fp1; char m, y[100]; int k = 0, i = 0, t = 1, p = 0; fp = fopen("C:\\Users\\HP\\Desktop\\New folder\\file 2.txt", "w"); fp1 = fopen("C:\\Users\\HP\\Desktop\\New folder\\file4.txt", "r"); if (fp == NULL) { printf("无法打开输出文件\n"); exit(EXIT_FAILURE); } if (fp1 == NULL) { printf("无法打开输入文件\n"); exit(EXIT_FAILURE); } m = fgetc(fp1); while (m != EOF) { k = 0; t = 1; // 读取单个姓名,处理无空格的末尾姓名 while (m != ' ' && m != EOF) { if (k < 99) { // 防止数组越界,预留'\0'的位置 y[k] = m; k++; } m = fgetc(fp1); } // 关键:添加字符串结束符,让fputs能正确识别 y[k] = '\0'; // 判断回文,优化循环次数到一半即可 p = k - 1; for (i = 0; i < k / 2; i++) { if (y[i] != y[p]) { t = 0; break; // 不相等直接终止循环,提升效率 } p--; } if (t == 1) { fputs(y, fp); fputc('\n', fp); // 可选:让每个回文姓名单独一行 printf("%s is a palindrome\n", y); } // 处理空格后的下一个字符,避免死循环 if (m != EOF) { m = fgetc(fp1); } } fclose(fp); fclose(fp1); return 0; }
关键修改点
- 添加字符串结束符:读取完姓名后执行
y[k] = '\0',确保y是合法的C风格字符串,fputs能正确写入。 - 修复边界读取逻辑:将姓名读取循环条件改为
m != ' ' && m != EOF,适配文件末尾无空格的情况。 - 数组越界防护:限制
k < 99,避免过长姓名导致数组溢出。 - 回文判断优化:循环仅执行到
k/2,减少不必要的比较操作。 - 符合C标准:将
void main()改为标准的int main()并添加返回值,使用EXIT_FAILURE宏替代自定义退出码。
内容的提问来源于stack exchange,提问作者Deepanshu Tyagi
相关产品推荐
相关产品推荐

