在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; // 返回参数总个数,主函数可按需使用 }
关键修改说明
- 先执行一次strtok()获取第一个参数,避免循环逻辑混乱;
- 循环条件改为判断当前
args[i]是否为NULL,也就是当strtok()没有更多参数时终止循环; - 后续调用strtok()时传入
NULL,保证持续分割剩余字符串; - 返回参数个数,方便主函数后续处理(比如判断参数是否为空);
- 修正后的函数会自动在
args数组末尾添加NULL,满足execvp()对参数列表必须以NULL结尾的要求。
内容的提问来源于stack exchange,提问作者ddc
相关产品推荐
相关产品推荐

