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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 09:53:47