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

C语言模拟Ubuntu终端:touch创建文件后ls显示文件名空白问题

问题分析与解决方案

核心问题

你遇到的本质问题是所有文件的file_name都指向同一个全局字符数组new_thing:

  • 创建文件时,new_file函数直接将file_name字段赋值为new_thing的指针,并未复制字符串内容;
  • 每次命令执行完后用memset清空new_thing,导致所有已创建文件的文件名指针都指向被清空的内存区域,因此执行ls时显示为空。

解决方案

给每个文件的file_name分配独立的堆内存,让每个文件名拥有专属存储区域,不再依赖全局数组。

修改new_file函数

使用strdup函数自动分配内存并复制字符串(最简洁的实现方式):

File new_file(char *file_name, uint8_t file_permissions)
{
    File file = {
        .file_name = strdup(file_name),
        .file_path = strdup(current_path), // 同步修复file_path的问题,避免路径变化影响旧文件
        .file_permissions = file_permissions,
        .contents = NULL
    };
    return file;
}

如果你的开发环境不支持strdup,可以手动用malloc+strcpy实现:

File new_file(char *file_name, uint8_t file_permissions)
{
    File file = {0};
    
    // 为文件名分配内存并复制内容
    size_t name_len = strlen(file_name) + 1;
    file.file_name = malloc(name_len);
    if (file.file_name) {
        strcpy(file.file_name, file_name);
    }
    
    // 为文件路径分配内存并复制内容
    size_t path_len = strlen(current_path) + 1;
    file.file_path = malloc(path_len);
    if (file.file_path) {
        strcpy(file.file_path, current_path);
    }
    
    file.file_permissions = file_permissions;
    file.contents = NULL;
    return file;
}

额外注意事项

  • 后续销毁File结构体时,需要调用free(file.file_name)和free(file.file_path)释放内存,避免内存泄漏;
  • new_folder函数存在同样的问题(folder_name和folder_path指向全局数组),建议用相同方式修改;
  • 命令解析逻辑可以简化,比如用sscanf替代手动循环复制,代码更简洁:
    // 替代原touch命令的手动解析逻辑
    if (strncmp(input, TOUCH_COMMAND " ", strlen(TOUCH_COMMAND)+1) == 0) {
        sscanf(input, "%*s %s", new_thing);
        // 后续创建文件的逻辑
    }
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 04:32:04