在C strtok()中拆分字符串

在C strtok()中拆分字符串,c,string,split,strtok,C,String,Split,Strtok,我想分割从终端输入接收的字符串,如果它们包含在缓冲区中。如果是,我想打印出来 #include <unistd.h> #include <stdio.h> #include <stdlib.h> #include <string.h> char* fich[5]={"ha","he","hi","ho","hu"}; int main(){ char passaarg[70]; const char space[2]= " "; char *

我想分割从终端输入接收的字符串,如果它们包含在缓冲区中。如果是,我想打印出来

#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

char* fich[5]={"ha","he","hi","ho","hu"};

int main(){

char passaarg[70];
const char space[2]= " ";
char *token;
int i;

while(1){

    read(STDIN_FILENO, passaarg, 70);
    for (i = 0; i < 5; i++){
        if(strncmp(passaarg, fich[i], 2) == 0){
            token = strtok(passaarg, space);
            while(token != NULL){
                printf("%s\n", token);
                token = strtok(NULL, space);
                printf("%s\n", token);
            }
            break;
        }
    }
}
return 0;
}
当令牌为
NULL
时,while循环将失败。此时,您正试图使用while循环中的第二个
printf()
打印此指针,这将导致未定义的行为


摆脱你的第二个
printf()

我怀疑你的问题在这里:

token = strtok(passaarg, space);
while(token != NULL){
    printf("%s\n", token);
    token = strtok(NULL, space);
    printf("%s\n", token);
}
strtok
返回
NULL
时,第二个
printf
将导致未定义的行为(可能是崩溃),这与字符串中没有更多标记时一样。把那条线去掉

在风格上,我会在这里使用
for
循环:

for(token = strtok(passaarg, space); token != NULL; token = strtok(NULL, space)) {
    printf("%s\n", token);
}

您的第二个
printf
最终将尝试打印
NULL
字符串。同意,我始终更喜欢使用
strtok()
的for循环构造。
token = strtok(passaarg, space);
while(token != NULL){
    printf("%s\n", token);
    token = strtok(NULL, space);
    printf("%s\n", token);
}
for(token = strtok(passaarg, space); token != NULL; token = strtok(NULL, space)) {
    printf("%s\n", token);
}