对给定字符串进行标记化的嵌套 strtok() 调用无法按预期工作

问题描述 投票:0回答:1
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;
}

输出: 猫 文件1.txtenter image description here

总而言之,我想从给定的字符串中解析linux命令。为了实现这一目标,我使用嵌套的 strtok() 结构,但我的外部 while 循环仅迭代一次,因此我无法从输入字符串中提取整个命令。

c string char strtok
1个回答
1
投票

函数 strtok 有一个静态局部变量,用于存储已解析字符串的最后一个指针。

例如在最里面的循环之后

while (token3 != NULL) {
    printf("%s\n", token3);
    token3 = strtok(NULL, " ");
}

静态变量将等于 NULL。因此所有外循环都将停止迭代。

而是使用函数 strtok_s,您可以为其指定一个参数,该参数将保留解析字符串中的最后一个 pos。

© www.soinside.com 2019 - 2024. All rights reserved.