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

C语言向output.txt写入字符串出现异常乱码符号问题求助

问题根因

写入文件出现大量异常符号、逻辑不符合预期,是代码里三个明显错误导致的:

  • 写入长度错误:调用write(fd, str, sizeof(str))时,sizeof(str)取的是str数组的固定大小20字节,无论用户输入的字符串实际多长,每次都会固定写入20字节。比如输入"first"仅占5个有效字符+1个字符串结束符共6字节,剩余14字节是str数组未初始化的栈内存随机值,这些值写到文件里就是你看到的乱码符号。
  • 退出逻辑写反:strcmp(str1, str2)的返回规则是两串相等返回0、str1大于str2返回正数、str1小于str2返回负数。当前代码判断result>=0就写入,意味着输入"-1"时返回值为0,反而会被当成有效内容写入,只有输入字符串ASCII码小于"-1"时才会触发退出,完全不符合设计预期。
  • 文件打开逻辑冗余且存在隐患:先调用open尝试打开,失败后再用fopen创建文件、再重新open拿文件描述符的写法完全多余,且没有做创建失败的异常处理;同时打开文件时没加O_APPEND标志,多次写入不会自动追加到文件末尾,会出现内容覆盖问题,也没有给新建文件配置访问权限。
修正后的可运行代码
#include<stdio.h> 
#include<unistd.h> 
#include<fcntl.h> 
#include <string.h>
int main()
{
    int fd;
    char str[20];
    // 打开文件:读写模式、不存在则创建、写入追加到末尾,新建文件权限设为644
    fd = open("output.txt", O_RDWR | O_CREAT | O_APPEND, 0644);
    if (fd == -1)
    {
        perror("open file failed");
        return 1;
    }
    while(1){
        printf("Enter String: \n");
        // 限制读取最大长度为19,预留1位存字符串结束符,避免数组越界
        scanf("%19s", str);
        // 输入为-1时退出循环
        if(strcmp(str, "-1") != 0){
            // 按字符串实际长度写入,不写入数组冗余空间
            write(fd, str, strlen(str));
            // 追加换行符分隔不同输入内容
            write(fd, "\n", 1);
            printf(" %s was written to output.txt \n", str); 
        }else{
            break;
        }
    }
    // 关闭文件描述符,释放资源
    close(fd);
    return 0;
}
关键修改说明
  • 写入长度从固定sizeof(str)改为strlen(str),仅写入用户输入的有效字符,从根源解决乱码问题
  • 修正strcmp判断逻辑,输入"-1"时正常退出循环,不会把退出指令写入文件
  • 简化文件打开逻辑,直接通过open的O_CREAT标志实现不存在即创建,加O_APPEND保证内容追加不覆盖,配置合理的文件权限,增加打开失败的错误提示
  • 给scanf增加读取长度限制,避免用户输入过长导致数组越界
  • 操作完成后主动关闭文件描述符,避免资源泄漏
  • 每次写入后追加换行符,不同输入内容在文件内分行存储,可读性更强

内容的提问来源于stack exchange,提问作者paradus-hex

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 18:06:25