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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 08:02:02