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

为什么C语言大小写翻转程序写入文件时会出现额外字符?

问题诊断与代码修正方案

你的代码存在以下核心错误,直接导致功能不生效和输出多余字符:

  • 参数校验逻辑错误:一是提前执行文件打开操作,再校验参数数量,参数不足时无效操作已经执行;二是仅判断argc < 2,实际需要传入源文件、目标文件两个路径,需要校验argc < 3;三是argv[1] == 0的判断完全无效,只要argc符合要求,对应argv元素不可能为空。
  • 转换逻辑未生效:你仅将转换后的ASCII码值通过printf输出到控制台,根本没有修改存储内容的buff数组,写入文件的还是原始读取的未转换内容。
  • 读取/写入长度控制错误:read返回值为实际读取到的字节数,你直接覆盖了该返回值,且固定写入64字节到目标文件,当实际读取内容不足64字节时,就会把buff中未初始化的随机内容写入文件,产生多余字符。
  • 循环结束条件错误:read不会主动给读取的内容追加\0,你按buff[i]!='\0'判断循环结束,可能出现越界访问。
修正后完整代码
#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>

int main(int argc, char *argv[]) {
    // 先做参数校验
    if(argc < 3) {
        printf("请传入源文件路径和目标文件路径\n");
        return 1;
    }

    // 打开文件,增加打开失败判断
    int in = open(argv[1], O_RDONLY);
    if (in == -1) {
        printf("源文件打开失败\n");
        return 1;
    }
    int out = open(argv[2], O_CREAT | O_WRONLY | O_TRUNC, 0644);
    if (out == -1) {
        printf("目标文件创建/打开失败\n");
        close(in);
        return 1;
    }

    char buff[64];
    ssize_t read_len;
    // 支持处理大于64字节的文件,循环读取直到读完
    while ((read_len = read(in, buff, sizeof(buff))) > 0) {
        // 遍历实际读取到的字节做大小写翻转
        for (int i = 0; i < read_len; i++) {
            if(buff[i] >= 'a' && buff[i] <= 'z') {
                buff[i] -= 32;
            } else if (buff[i] >= 'A' && buff[i] <= 'Z') {
                buff[i] += 32;
            }
            // 其他字符不做修改
        }
        // 仅写入实际读取并转换后的字节数,避免多余字符
        write(out, buff, read_len);
    }

    close(in);
    close(out);
    return 0;
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 06:45:07