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); } }
关键修改说明
- 先获取
login_str变量,复用登录用户信息,避免重复调用函数 - 移除多余的
);语法错误 - 添加
home_dir、malloc的空指针检查,完善错误处理 - 使用
snprintf格式化字符串,将%@替换为实际的登录用户C字符串(假设wi_string_cstr是获取wi_string_t对应C风格字符串的函数,若实际API不同,替换为对应函数即可) - 在所有退出路径释放
filepath,避免内存泄漏 fopen失败时添加perror打印错误原因,方便调试
内容的提问来源于stack exchange,提问作者Sascha7777
相关产品推荐
相关产品推荐

