如何遍历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
相关产品推荐
相关产品推荐

