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

如何遍历char**类型单词数组并按>分割提取内容

处理带重定向符号>的命令拆分问题

现有C语言函数commands可将输入命令拆分为char**类型的单词数组,但存在一个问题:当输入命令包含无空格的重定向符号(比如ls tests/folder-test>/tmp/output)时,函数会把tests/folder-test>/tmp/output作为单个单词返回,而我们需要将其拆分为命令参数tests/folder-test,同时提取出重定向目标路径/tmp/output,最终得到修正后的数组{"ls","tests/folder-test"}。

解决方案实现

我们可以编写一个辅助函数,遍历commands函数返回的单词数组,检查每个单词中是否包含>符号,完成拆分和路径提取,同时修正原数组内容:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

// 辅助函数:处理带>的单词,拆分命令参数和重定向路径
int split_redirection(char ***cmd_list, char **output_path) {
    if (cmd_list == NULL || *cmd_list == NULL || output_path == NULL) {
        return -1;
    }

    *output_path = NULL;
    char **current = *cmd_list;

    // 遍历每个单词
    while (*current != NULL) {
        char *redir_pos = strchr(*current, '>');
        if (redir_pos != NULL) {
            // 拆分出>之前的命令参数部分
            size_t param_len = redir_pos - *current;
            char *new_param = strndup(*current, param_len);
            if (new_param == NULL) {
                return -1;
            }

            // 拆分出>之后的路径部分(跳过可能的空格)
            char *path_start = redir_pos + 1;
            path_start += strspn(path_start, " \t\r\n");
            if (*path_start != '\0') {
                *output_path = strdup(path_start);
                if (*output_path == NULL) {
                    free(new_param);
                    return -1;
                }
            }

            // 替换原单词,释放旧内存
            free(*current);
            *current = new_param;

            // 找到目标后退出循环(假设单个重定向)
            break;
        }
        current++;
    }

    return 0;
}

// 测试用例
int main() {
    const char *input_cmd = "ls tests/folder-test>/tmp/output";
    char **cmd_array = commands(input_cmd);
    if (cmd_array == NULL) {
        fprintf(stderr, "Command split failed\n");
        return 1;
    }

    char *output_path = NULL;
    if (split_redirection(&cmd_array, &output_path) == 0) {
        printf("修正后的命令数组:\n");
        char **ptr = cmd_array;
        while (*ptr != NULL) {
            printf("  %s\n", *ptr);
            ptr++;
        }

        if (output_path != NULL) {
            printf("提取的重定向路径:%s\n", output_path);
        }
    }

    // 释放内存
    char **ptr = cmd_array;
    while (*ptr != NULL) {
        free(*ptr);
        ptr++;
    }
    free(cmd_array);
    free(output_path);

    return 0;
}

代码说明

  • 函数split_redirection接收命令数组的指针和存储重定向路径的指针,遍历数组找到包含>的单词
  • 使用strchr定位>符号,拆分出参数部分和路径部分,分别处理内存分配
  • 替换原数组中的单词为拆分后的参数,同时将重定向路径存入指定指针
  • 包含内存错误检查,避免内存泄漏

注意事项

  • 该实现假设命令中只有单个>重定向符号,如果需要支持多个或其他重定向(比如>>),可以扩展逻辑判断redir_pos后的字符
  • 使用完修正后的数组和重定向路径后,需要手动释放所有内存,避免泄漏

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 14:29:52