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

C语言中调用fprintf无法将反转字符串写入输出文件的问题求助

字符串反转文件读写的问题排查与修复

fprintf无法正常将内容写入目标文件的问题,是多个代码逻辑、操作错误叠加导致的,具体问题和修正方式如下:

核心错误点

  • 格式符参数不匹配
    代码中写的fprintf(fout, "%s", str[i])存在类型错配:%s格式符要求传入的是字符串首地址,而str[i]是单个字符,这个字符值会被fprintf误解析为内存地址,要么触发非法内存访问的段错误,要么根本无法写入有效内容。单个字符写入文件时,应该用%c作为格式符。
  • 反转遍历逻辑错误
    你硬编码从数组下标49(即dim-1)开始倒序遍历,没有先获取fgets实际读入的有效字符串长度,遍历范围会包含大量未初始化的垃圾内存,完全达不到反转实际读入内容的效果。正确的处理逻辑是先通过strlen()拿到当前读到的字符串长度,从长度减一的下标位置倒序遍历到0下标。
  • 输出文件未正确关闭
    代码最后仅调用了fclose(fin)关闭输入文件,完全没有关闭打开的fout输出流。C标准库的文件流自带内存缓冲区,没有执行fclose(fout)时,fprintf写入的内容会一直滞留在内存缓冲区里,不会真正同步到磁盘文件,这是你看不到目标文件内容的最直接原因。
  • 缺少文件打开异常判断
    没有判断fopen的返回值,如果输入文件不存在、输出文件无写入权限,fopen会返回NULL,此时直接对空指针做读写操作会直接导致程序崩溃。
  • 循环边界遗漏
    原有循环条件是i > 0,即便修正其他错误,也会漏掉字符串下标为0的第一个字符,导致反转结果不完整。

修正后的可运行代码

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define dim 50

int main(int argc, char const *argv[]) {
    FILE *fin;
    FILE *fout;
    char str[dim];
    char nomefilein[dim];
    char nomefileout[dim];
    int i, str_len;

    printf("Inserisci il nome del file da leggere:\n");
    scanf("%s", nomefilein);
    printf("Inserisci il nome del file da scrivere:\n");
    scanf("%s", nomefileout);

    // 打开文件并做异常判断
    fin = fopen(nomefilein, "r");
    if (fin == NULL) {
        perror("打开输入文件失败");
        exit(EXIT_FAILURE);
    }
    fout = fopen(nomefileout, "w");
    if (fout == NULL) {
        perror("打开输出文件失败");
        fclose(fin);
        exit(EXIT_FAILURE);
    }

    while (fgets(str, dim, fin) != NULL) {
        printf("%s", str);
        // 获取当前读入的字符串实际长度
        str_len = strlen(str);
        // 从最后一个有效字符开始倒序遍历
        for (i = str_len - 1; i >= 0; i--) {
            // 单字符写入替换原来的%s格式符
            fprintf(fout, "%c", str[i]);
        }
    }

    // 两个文件流都要关闭,确保缓冲区内容写入磁盘
    fclose(fin);
    fclose(fout);

    return 0;
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.24 21:36:04