如何在C语言中移除字符串中'<'与'|'之间的子串?
解决C语言字符串解析中移除指定区间内容的问题
我来帮你搞定这个字符串解析的问题!你现在的需求很明确:用strtok拆分字符串时,跳过<和|之间的所有内容(也就是x y z),只保留其他需要的token到commandsArray里对吧?
你的原代码已经做了重定向的标记,但缺少了跳过中间内容的逻辑,所以那些不需要的token还是会被加入数组。我们可以在原逻辑基础上新增一个状态变量,来控制什么时候跳过token,具体修改如下:
// 注意:把字符串字面量改成可修改的字符数组,避免strtok触发未定义行为 char buff[] = "cat –v < x y z | "; char *p = strtok(buff, " "); int skip_tokens = 0; // 新增:标记是否需要跳过当前token while (p != NULL) { if (!strcmp(p, "<") && !isredirected) { isredirected = 1; inputredirectionindex = tokenscounter; // 开启跳过模式,同时保留"<"本身 skip_tokens = 1; commandsArray[tokenscounter++] = p; } else if (!strcmp(p, "|")) { // 遇到管道符,关闭跳过模式,同时保留"|" skip_tokens = 0; commandsArray[tokenscounter++] = p; } else if (!skip_tokens) { // 只有不处于跳过模式时,才将token加入数组 commandsArray[tokenscounter++] = p; } // 无论是否跳过,都继续取下一个token p = strtok(NULL, " "); }
关键修改点说明:
- 新增
skip_tokens状态变量:初始为0(不跳过),当找到<时设为1,遇到|时重置为0,用来控制是否将当前token加入数组。 - 保留必要的符号:
<和|是语法符号,我们需要保留它们,所以在切换状态的同时把它们加入commandsArray。 - 修复字符串字面量的问题:原代码中
buff是字符串字面量,strtok会尝试修改它,这属于C语言中的未定义行为,所以改成字符数组char buff[] = "...";才能安全使用。
修改后,commandsArray最终会得到["cat", "–v", "<", "|"],完美实现了你移除<和|之间内容的需求。如果还有其他边界情况(比如没有|或者多个重定向),可以再基于这个逻辑扩展判断条件。
内容的提问来源于stack exchange,提问作者Samun
相关产品推荐
相关产品推荐

