2014-12-05 93 views
-1

我想拆分從終端輸入收到的字符串,如果它們包含在緩衝區中。如果他們是我想打印它們。拆分字符串在C 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 *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; 
} 

我的輸出如下一個:提前

ha he 
ha 
he 

he 

Segmentation fault (core dumped) 

謝謝!

+1

你的第二個'printf'最終將嘗試打印'NULL'字符串。 – 2014-12-05 15:24:29

回答

2

我懷疑你的問題是在這裏:

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

這第二printf將導致不確定的行爲(有可能是崩潰)時strtok回報NULL,因爲它會在那裏在字符串中沒有更多的標記。只要刪除該行。

風格上,我會在這裏使用一個for循環:

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

同意,我總是喜歡'strtok()'的for-loop結構。 – JohnH 2014-12-05 17:49:54

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

當令牌爲NULL時,while循環將失敗。此時,您正嘗試在while循環中使用第二個printf()來打印此指針,這將導致未定義的行爲。

擺脫你的第二個printf()