C语言:无法将文件中修改后的对话文本写入输出文件
问题排查与解决思路
1. 先确认字符串的可修改性
在C语言里,如果读取文件内容后存到了只读内存(比如直接用char *指向未分配可写空间的地址,或者误将字符串字面量当作可写缓冲区),所有修改操作都会无效,甚至触发程序崩溃。必须用可写内存存储读取的内容:
- 用
malloc根据文件大小动态分配内存(记得加1存字符串结束符\0) - 或者用足够大的字符数组(要确保数组能装下整个文件内容)
正确的读取示例:
// 获取文件大小 fseek(fp, 0, SEEK_END); long file_size = ftell(fp); fseek(fp, 0, SEEK_SET); // 分配可写内存 char *content = malloc(file_size + 1); if (content == NULL) { perror("malloc failed"); return 1; } // 读取内容并添加结束符 fread(content, 1, file_size, fp); content[file_size] = '\0';
2. 验证对话识别逻辑是否准确
如果没正确识别引号内的内容,修改规则根本不会触发,常见问题包括:
- 混淆了单引号/双引号(比如文本用双引号,但代码判断的是单引号)
- 没处理嵌套引号(比如对话里的
He said: "I'm here",单引号会被误判为对话结束) - 只处理了第一个引号片段,没循环识别所有对话
检查你的引号判断逻辑,比如:
int in_quote = 0; for (int i = 0; content[i] != '\0'; i++) { if (content[i] == '"') { // 匹配文本实际使用的引号类型 in_quote = !in_quote; continue; } if (in_quote) { // 在此处执行对话内容的修改逻辑 process_char(&content[i]); } }
3. 逐个验证修改规则的实现
规则1:元音后r改h
要准确判断元音(注意大小写),且确保是元音字符之后的r才修改,同时避免数组越界:
char vowels[] = "aeiouAEIOU"; if (i > 0 && strchr(vowels, content[i-1]) != NULL && content[i] == 'r') { content[i] = 'h'; }
规则2:非单a结尾单词加r
需要先正确拆分单词,判断单词结尾是否为单个'a'(不是单词中间的a,也不是连续多个a),且修改时要注意内存扩容——如果用动态分配的内存,需要用realloc扩展空间来容纳新增的字符。
规则3:very替换为wicked
替换时要确保找到所有"very"子串,且替换后正确移动后续字符,避免循环替换:
char *pos = strstr(content, "very"); while (pos != NULL) { // 计算长度差:wicked(5) - very(4) = +1 memmove(pos + 5, pos + 4, strlen(pos + 4) + 1); memcpy(pos, "wicked", 5); pos = strstr(pos + 5, "very"); // 跳过已替换部分 }
4. 确认修改后的内容正确写入
修改完成后,要确保写入的是修改后的content,而非原文件内容:
FILE *out_fp = fopen("output.txt", "w"); if (out_fp == NULL) { perror("fopen output failed"); free(content); return 1; } fputs(content, out_fp); fclose(out_fp); free(content); // 记得释放动态分配的内存
内容的提问来源于stack exchange,提问作者user22532748
相关产品推荐
相关产品推荐

