【问题标题】:strtok() tokenizes only once when nestedstrtok() 嵌套时只标记一次
【发布时间】:2018-09-23 15:02:13
【问题描述】:

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

我想首先使用: 作为分隔符进行分隔,当它到达第二部分(即1,2,3)并尝试在其上使用strtok(使用,)时,它无法按预期工作.

#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

预期输出:

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

【问题讨论】:

  • 你在循环中调用 strtok 表示你想用空格而不是逗号分割,所以它会返回,直到找到下一个永远不会出现的空格,因此是 "2,3"

标签: c string strtok


【解决方案1】:

更新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 库,因此您可能还会收到一些关于隐式声明的警告。

【讨论】:

    猜你喜欢
    • 2021-07-29
    • 1970-01-01
    • 2015-10-06
    • 2021-06-30
    • 2023-03-10
    • 2021-12-17
    • 2018-07-24
    • 2013-11-23
    • 2012-05-27
    相关资源
    最近更新 更多