char str[] = "cat file1.txt ; cat file2.txt | grep book ; grep pen";
我想使用
strtok()
对提供的输入字符串进行标记。在第一步中,我想用“|”对给定的字符串进行标记象征。然后,我用“;”标记每个子字符串。最后,我用“”(空字符)标记生成的子字符串。最后,我的目标是获得一个字符串数组的数组,如下所示:
char* commands = {{"cat", "file1.txt", NULL},
{"cat", "file2.txt", NULL},
{"grep","book", NULL},
{"grep", "pen", NULL}
};
但是,我的 while 循环仅迭代一次,因此我无法处理整个字符串。我得到的只是:
cat
file1.txt
我在将子字符串传递给
strtok()
之前复制了子字符串,但它不起作用。我花了将近3天的时间,但还没有实现。任何帮助将不胜感激。有关更多详细信息,我提供了代码和我收到的输出。
代码:
#include <stdio.h>
#include <string.h>
int main() {
char str[] = "cat file1.txt ; cat file2.txt | grep book ; grep pen";
char *token1, *token2, *token3;
// First tokenize by '|'
token1 = strtok(str, "|");
while (token1 != NULL) {
char * str_copy = strdup(token1); // Duplicate the string for each iteration
token2 = strtok(str_copy, ";");
while (token2 != NULL) {
char * str_copy2 = strdup(token2);
token3 = strtok(str_copy2, " ");
while (token3 != NULL) {
printf("%s\n", token3);
token3 = strtok(NULL, " ");
}
token2 = strtok(NULL, ";");
}
token1 = strtok(NULL, "|");
}
return 0;
}
总而言之,我想从给定的字符串中解析linux命令。为了实现这一目标,我使用嵌套的 strtok() 结构,但我的外部 while 循环仅迭代一次,因此我无法从输入字符串中提取整个命令。
函数 strtok 有一个静态局部变量,用于存储已解析字符串的最后一个指针。
例如在最里面的循环之后
while (token3 != NULL) {
printf("%s\n", token3);
token3 = strtok(NULL, " ");
}
静态变量将等于 NULL。因此所有外循环都将停止迭代。
而是使用函数 strtok_s,您可以为其指定一个参数,该参数将保留解析字符串中的最后一个 pos。