使用strtok时获取Null值[C]

时间:2017-10-05 20:49:09

标签: c strtok

我正在开发一个涉及使用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而不是null?

2 个答案:

答案 0 :(得分:1)

您可以对字符串进行标记,将其保存在双指针中,然后将其打印多次!

答案 1 :(得分:0)

请注意,您的代码实际上会将字符串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每次找到令牌时都会引入'\0'个字符。因此,在第一次运行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;
}