2013-05-29 147 views
0

我注意到我的變量input2只打印字符串中的第一個單詞,這導致程序的其餘部分出現問題(即不能正確打印名詞)。任何有關爲什麼發生這種情況的見解將不勝感激。printf只打印字符串中的第一個單詞?

int main(int argc, char* argv[]){ 

    char *input = strtok(argv[1], " \"\n"); 
    //printf("%s\n", input); 
    int position; 
    int check = 0; 
    int first = 1; 
    while (input != NULL) { 
     position = binary_search(verbs, VERBS, input); 
     //printf("%s\n", input); 
     //printf("%d\n", position); 
     if (position != -1){ 
      if (first){ 
       printf("The verbs were:"); 
       first = 0; 
       check = 1; 
      } 
      printf(" %s", input); 
     } 
     input = strtok(NULL, " "); 
    } 
    if (check == 1){ 
     printf(".\n"); 
    } 
    if (check == 0){ 
     printf("There were no verbs!\n"); 
    } 

    char *input2 = strtok(argv[1], " \"\n"); 
    //printf("%s\n", input2); 
    int position2; 
    int check2 = 0; 
    int first2 = 1; 

    while (input2 != NULL) { 
     position2 = binary_search(nouns, NOUNS, input2); 
     //printf("%s\n", input2); 
     //printf("%d\n", position2); 
     if (position2 != -1){ 
      if (first2){ 
       printf("The nouns were:"); 
       first2 = 0; 
       check2 = 1; 
      } 
      printf(" %s", input2); 
     } 
     input2 = strtok(NULL, " "); 
    } 
    if (check2 == 1){ 
     printf(".\n"); 
    } 
    if (check2 == 0){ 
     printf("There were no nouns!\n"); 
    } 

     return 0; 
} 
+3

是不是已經基於空白解析的命令行參數?如果是這樣,'argv [1]'從一開始就只有一個單詞。 – aardvarkk

+0

@aardvarkk:如果它被稱爲'程序'fly run think'',那麼不是。但要求調用約定並且不支持多個參數是很奇怪的。 – aschepler

+0

@aschepler夠了! – aardvarkk

回答

6

strtok()修改你傳遞爲源字符串,因此調用strtok()argv[1]第二時間上的argv[1]原值不採取行動,但只有第一個令牌。

你可能想要做這樣的事情:

char* s = strdup(argv[1]); 

並作用於字符串sØargv[1]將保持不變 - 您可以稍後再處理它。但是,當你完成它時,你需要釋放重複的字符串的內存。

+0

謝謝,有道理。 – Ace

+0

我認爲這可能是有效的關於這個功能的說明不是C std ... – Jack

相關問題