在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);
}