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

C语言字符串写入文件异常求助:代码无法正常工作

问题修复:C语言字符串写入文件逻辑错误

原代码存在的问题

  • 语法错误:else分支内多余的);,会导致编译失败
  • 未替换格式占位符:直接写入Login: %@字符串,没有将%@替换为实际的登录用户信息,和wr_printf_block的逻辑不一致
  • 内存泄漏:malloc分配的filepath未释放
  • 错误处理缺失:fopen失败时无任何处理,也未释放已分配的内存
  • 类型不匹配:WI_STR生成的wi_string_t*无法直接传给fputs,需要转换为C风格字符串

修复后的代码

static void wr_message_user_info_login(wi_p7_message_t *message) {
    wi_date_t           *date;
    wi_string_t         *string, *interval;
    wi_p7_uint32_t      uid, build, bits;

    // 获取登录用户字符串
    wi_string_t* login_str = wi_p7_message_string_for_name(message, WI_STR("wired.user.login"));
    wr_printf_block(WI_STR("Login: %@"), login_str);

    char *filename = "/.wirebot/wirebot.login";
    char *home_dir = getenv("HOME");
    if (home_dir == NULL) {
        // 处理HOME环境变量不存在的情况
        return;
    }
    char *filepath = malloc(strlen(home_dir) + strlen(filename) + 1);
    if (filepath == NULL) {
        // 处理内存分配失败
        return;
    }
    sprintf(filepath, "%s%s", home_dir, filename);

    FILE *fp = fopen(filepath, "w");
    if (fp == NULL) {
        // 添加错误提示,释放内存
        perror("Failed to open file");
        free(filepath);
        return;
    }
    else {
        // 将wi_string_t转换为C风格字符串,格式化后写入
        char buffer[256]; // 根据实际需求调整缓冲区大小
        snprintf(buffer, sizeof(buffer), "Login: %s", wi_string_cstr(login_str));
        fputs(buffer, fp);
        fclose(fp);
        free(filepath);
    }
}

关键修改说明

  1. 先获取login_str变量,复用登录用户信息,避免重复调用函数
  2. 移除多余的);语法错误
  3. 添加home_dir、malloc的空指针检查,完善错误处理
  4. 使用snprintf格式化字符串,将%@替换为实际的登录用户C字符串(假设wi_string_cstr是获取wi_string_t对应C风格字符串的函数,若实际API不同,替换为对应函数即可)
  5. 在所有退出路径释放filepath,避免内存泄漏
  6. fopen失败时添加perror打印错误原因,方便调试

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 07:05:21