使用 strtok [C] 时获取 Null 值

Getting Null values when using strtok [C]

我正在从事一个涉及使用 strtok 的项目,由于某种原因,我得到的是空值而不是实际值(应该是 "Two" 和 "Three")。这是我的代码:

int main(){
    int h,z;

    char text[100] = "One Two Three";

    for(h = 0; h < 4; h ++){

        char *first = strtok(text, " ");
        printf("%s\n",first);

        for(z = 0;  z < 3; z++){
            char *second = strtok(NULL,  " ");
            printf("%s\n",second);


        }
    }
    return 0;
}

我得到的输出是:

One
Two
Three
One
(null)
(null)
One
(null)
(null)
One
(null)
(null)

我该怎么做才能获得正确的值 TwoThree 而不是空值?

请注意,您的代码实际上将字符串 text 重新标记 4 次,因为您有嵌套循环。另请注意,z < 3 是一次性的,应该是 z < 2:

int main(){
    int h,z;

    char text[100] = "One Two Three";

    for(h = 0; h < 4; h ++){

        char *first = strtok(text, " ");
        printf("%s\n",first);

        for(z = 0;  z < 2; z++){
            char *second = strtok(NULL,  " ");
            printf("%s\n",second);


        }
    }
    return 0;
}

但是 strtok 每次找到标记时都会引入 '[=16=]' 个字符。因此,在 for(h...) 循环的第一个 运行 之后,text 将是 "One",并且对于任何后续循环只能找到一个标记; "One".

中不存在标记 #2 和 #3

要重新标记(无论出于何种原因),您必须重新初始化 text:

int main(){
    int h,z;

    char text[100];

    for(h = 0; h < 4; h ++){

        strcpy(text,"One Two Three");

        char *first = strtok(text, " ");
        printf("%s\n",first);

        for(z = 0;  z < 2; z++){
            char *second = strtok(NULL,  " ");
            printf("%s\n",second);
        }
    }
    return 0;
}

您可以标记字符串,将其保存在双指针中并打印任意多次!