2012-03-10 8 views
0

Я пытаюсь сделать программу, которая требует сканирования более чем на одно слово, и я не знаю, как это сделать с неопределенной длиной. Мой первый порт захода был scanf, однако это только сканирование одним словом (я знаю, что вы можете делать scanf («% d% s», temp, временный) ;, но я не знаю, сколько слов ему нужно), поэтому Я огляделся и нашел фейз. Одна из проблем, с этим я не могу найти, как сделать это перейти к следующему коду, напримерСканирование более чем одним словом в C

scanf("%99s",temp); 
printf("\n%s",temp); 
if (strcmp(temp,"edit") == 0) { 
    editloader(); 
} 

будет работать editloader(), в то время как:

fgets(temp,99,stdin); 
while(fgets(temporary,sizeof(temporary),stdin)) 
    { 
     sprintf(temp,"%s\n%s",temp,temporary); 
    } 
if (strcmp(temp,"Hi There")==0) { 
    editloader(); 
} 

не будет двигаться на STRCMP (код) , и будет придерживаться исходного цикла. Что мне делать вместо этого?

+0

Я настоятельно рекомендую использовать функцию 'getline' POSIX 2008, а затем работать над каждой целой строкой. –

ответ

0

Я бы сканировал в каждом цикле слово с scanf(), а затем скопировал его с помощью strcpy() в «основной» строке.

+0

Единственная проблема заключается в том, что если бы у меня был цикл, мне нужно было бы знать, сколько слов может быть введено. – user1150512

+0

'fgets (temp, 99, stdin); while (fgets (временный, sizeof (временный), stdin) && (strcmp (temp, "Hi There")! = 0)) { sprintf (temp, "% s \ n% s", temp, временный) ; } editloader(); ' Итак, вы проверяете условие while, если есть вход, и если« Привет там »еще нет. Затем – codor

0

может быть, вы можете использовать метод GetLine .... Я использовал его в VC++, но если он существует в стандартной библиотеке C тоже тогда вы хорошо идти чек здесь http://www.daniweb.com/software-development/c/threads/253585 http://www.cplusplus.com/ ссылка/iostream/IStream/GetLine/

Надеется, что вы найдете то, что вы ищете

0

я использую это для чтения из стандартного ввода и получить тот же формат, что вы получите, передавая в качестве аргументов ... так что вы может содержать пробелы в словах и цитируемые слова внутри строки. Если вы хотите прочитать из определенного файла, просто сфотографируйте его и измените линию fgets.

#include <stdio.h> 
void getargcargvfromstdin(){ 
char s[255], **av = (char **)malloc(255 * sizeof(char *)); 
unsigned char i, pos, ac; 
    for(i = 0; i < 255; i++) 
     av[i] = (char *)malloc(255 * sizeof(char)); 
enum quotes_t{QUOTED=0,UNQUOTED}quotes=UNQUOTED; 

while (fgets(s,255,stdin)){ 

i=0;pos=0;ac=0; 
while (i<strlen(s)) { 
    /* '!'=33, 'ÿ'=-1, '¡'=-95 outside of these are non-printables */ 
    if (quotes && ((s[i] < 33) && (s[i] > -1) || (s[i] < -95))){ 
     av[ac][pos] = '\0'; 
     if (av[ac][0] != '\0') ac++; 
     pos = 0; 
    }else{ 
     if (s[i]=='"'){ /* support quoted strings */ 
      if (pos==0){ 
       quotes=QUOTED; 
      }else{  /* support \" within strings */ 
       if (s[i-1]=='\\'){ 
        av[ac][pos-1] = '"'; 
       }else{ /* end of quoted string */ 
        quotes=UNQUOTED; 
       } 
      } 
     }else{   /* printable ascii characters */ 
      av[ac][pos] = s[i]; 
      pos++; 
     } 
    } 
    i++; 
} 

//your code here ac is the number of words and av is the array of words 
} 
} 
Смежные вопросы