2013-05-29 4 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 type''. Но странно требовать, чтобы вызов вызывал и не поддерживал несколько аргументов. – aschepler

+0

@aschepler достаточно справедливо! – aardvarkk

ответ

6

strtok() изменяет строку вы передаете в качестве источника, так призывающую strtok() с argv[1] во второй раз не действует на первоначальной стоимости argv[1], но только первый маркер.

Вы можете захотеть сделать что-то вроде:

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

и действуют на струну s о argv[1] будет оставлен без изменений - вы можете обработать его позже. Однако вам нужно будет освободить память дублированной строки, когда вы закончите с ней.

+0

Спасибо, имеет смысл. – Ace

+0

Я думаю, что может быть справедливым положить заметку об этом funtion не C std ... – Jack

Смежные вопросы