strtok()嵌套时仅令牌化一次

时间:2018-09-23 15:02:14

标签: c string strtok

假设我有以下字符串:0:1,2,3

我想首先使用:作为分隔符,并在到达第二部分时(即1,2,3)进行分离,并尝试在其上使用strtok(与{{1} })无法正常工作。

,

我得到的输出:

#include <stdio.h>
#include <stdbool.h>

int main(void){
    char s[10];
    strcpy(s, "0:1,2,3");
    char* token1 = strtok(s, ":");
    //To let me know it is on the second part
    bool isSecondToken = false;
    while (token1) {
        printf("token1: %s\n", token1);
        if(isSecondToken == true){
            char* token2 = strtok(token1, ",");
            while (token2) {
                printf("token2: %s\n", token2);
                token2 = strtok(NULL, " ");
            }
        }
        token1 = strtok(NULL, " ");
        isSecondToken = true;
    }
}

预期输出:

token1: 0
token1: 1,2,3
token2: 1
token2: 2,3

1 个答案:

答案 0 :(得分:3)

在更新token1token2指针时,您需要使用相同的令牌分配器:

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

int main(void){
    char s[10];
    strcpy(s, "0:1,2,3");
    char* token1 = strtok(s, ":");
    //To let me know it is on the second part
    bool isSecondToken = false;
    while (token1) {
        printf("token1: %s\n", token1);
        if(isSecondToken == true){
            char* token2 = strtok(token1, ",");
            while (token2) {
                printf("token2: %s\n", token2);
                token2 = strtok(NULL, ",");
            }
        }
        token1 = strtok(NULL, ":");
        isSecondToken = true;
    }
}

strcpy也需要string.h库,因此您可能还会收到一些隐式声明的警告。