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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 16:00:16