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

在while循环中调用strtok()解析Shell命令出现重复结果的问题

修复Shell命令解析中strtok()导致的命令重复问题

问题根源

  • strtok()调用逻辑错误:每次循环都传入原始字符串command调用strtok(),会导致函数每次都从头开始分割,反复获取第一个命令项,造成重复。strtok()的正确用法是:首次调用传目标字符串,后续调用必须传NULL,这样才会从上次分割的位置继续处理剩余内容。
  • 循环条件完全错误:初始状态下args数组的元素都是未初始化的垃圾值,用while (args[i] != NULL)作为循环条件会触发未定义行为,根本无法正确遍历分割后的命令参数。

修正后的代码

int parse_command(char command[], char *args[])
{
    int i = 0;
    // 首次调用strtok,传入原始命令字符串和分隔符
    args[i] = strtok(command, " \n");
    // 当获取到有效参数时,继续分割剩余内容
    while (args[i] != NULL) {
        i++;
        // 后续调用传NULL,让strtok从上次位置继续分割
        args[i] = strtok(NULL, " \n");
    }
    return i; // 返回参数总个数,主函数可按需使用
}

关键修改说明

  1. 先执行一次strtok()获取第一个参数,避免循环逻辑混乱;
  2. 循环条件改为判断当前args[i]是否为NULL,也就是当strtok()没有更多参数时终止循环;
  3. 后续调用strtok()时传入NULL,保证持续分割剩余字符串;
  4. 返回参数个数,方便主函数后续处理(比如判断参数是否为空);
  5. 修正后的函数会自动在args数组末尾添加NULL,满足execvp()对参数列表必须以NULL结尾的要求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 11:10:04