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

C语言search_and_replace程序运行异常,求排查与优化方案

问题分析与修正代码

原代码的核心问题

  1. 直接修改argv内存:命令行参数的内存空间是只读的,强行修改会触发未定义行为。
  2. 变量未初始化:k未赋值就进入循环,导致逻辑混乱。
  3. 逻辑偏离需求:题目要求替换单个字符,不需要多层嵌套循环处理字符串交换,完全搞错了核心逻辑。
  4. 边界情况未处理:参数数量不符时未输出换行,正常处理完也没补换行。
  5. 变量声明位置不符合要求:所有变量都放在函数开头,没有移到循环内部。

修正后的代码

#include <unistd.h>

int main(int argc, char **argv)
{
    if (argc == 4)
    {
        // 外层while:遍历待替换的字符串
        int i = 0;
        while (argv[1][i])
        {
            char current_char = argv[1][i];
            // 内层while:确认要替换的目标字符(兼容参数为单个字符的要求)
            int j = 0;
            while (argv[2][j] != '\0')
            {
                if (current_char == argv[2][j])
                {
                    current_char = argv[3][0];
                    break; // 找到目标字符后直接退出内层循环
                }
                j++;
            }
            write(1, &current_char, 1);
            i++;
        }
    }
    // 所有情况都输出换行
    write(1, "\n", 1);
    return 0;
}

关键改进说明

  • 变量声明位置:i、j、current_char都在各自循环或使用的作用域内声明,满足“移至循环内部”的要求。
  • 仅用两个while循环:外层遍历原字符串,内层验证并匹配要替换的字符(符合题目隐含的“第二个参数为单个字符”要求,同时兼容意外输入多字符的情况)。
  • 避免未定义行为:不再修改argv,而是用临时变量current_char处理替换逻辑,安全输出结果。
  • 覆盖所有边界情况:
    • 参数数量不为3时,直接输出换行。
    • 替换字符不存在于原字符串时,输出原字符串加换行。
    • 替换成功时输出替换后的结果加换行。
  • 符合C标准:补充了return 0,保证main函数的正确退出状态。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 08:10:04