2010-10-06 3 views
4

У меня проблема с использованием fgets. Предполагается, что цикл должен читать строку макс. 19 символов, проанализируйте этот массив символов, а затем дождитесь следующего ввода. Проблема заключается в том, что если введенная строка содержит 19 символов, fgets будет заполнять str оставшимися символами до тех пор, пока не будет введен символ Ctrl-D или новая строка, таким образом, инициируя новый цикл без нового ввода. Ввод (stdin) должен каким-то образом быть сброшен после считывания 19 символов, поэтому цикл может начинаться с чистого листа. У кого-нибудь есть решение?C, flushing stdin

char str[20]; 
while((fgets(str, 20, stdin) != NULL)) { 
    puts(str);  //monitoring str 

    if(str[0] == 'q') break; 
} 

Пример использования в:

hola hola      //user inputs 9 chars + newline 
hola hola      //puts writes 

hoo hoo hoo hoo hooh    //user inputs 20 chars + newline 
hoo hoo hoo hoo hoo    //puts writes 
h        // 

ответ

2
char str[21]; /* read one extra character */ 
while (fgets(str, 21, stdin) != NULL) { 
    /* if line too long, truncate and swallow the rest of the line */ 
    if (strlen(str) > 19) { 
     str[19] = '\0'; 
     while (getchar() != '\n' && !feof(stdin)) 
      ; 
    } 

    puts(str); 
    if(str[0] == 'q') break; 
} 
+0

спасибо, я думаю, что будет делать трюк. – DoggyDoo

4

scanf("%*[^\n]\n");, вероятно, один из самых простых возможностей.

+0

Я предполагаю, что вы должны передать аргумент буфера символа. Это решение не проверяет переполнение буфера, не так ли? Гош мой C настолько ржавый. – xpmatteo

+0

@xpmatteo: ему не нужен аргумент buffer. От man scanf: «Необязательный символ« * присваивания присваивания »: scanf() считывает входные данные в соответствии с инструкцией преобразования, но отбрасывает вход. Не требуется соответствующий аргумент указателя» –

+0

Как отметил @Giuseppe, часть красоты Это означает, что вам не нужно передавать буфер. Поскольку буфер отсутствует, нет возможности переполнения буфера. Не обвиняйте себя в том, что вы не узнаете об этом: это преобразование, безусловно, находится на эзотерической стороне. –

-1

Попытка:

fgets(str, 2000, stdin) 

Затем усечение ул 19 :-)

+3

... и надеемся, что пользователь никогда не встанет в линию длиной 2 МБ! –

+0

True :-) но это быстрое решение. – xpmatteo

0

Другой возможный вариант с ограничением по fgets() будучи единственным входным и используется на уровне петли. Это определенно очень похоже на то, что предложил ларман. Поэтому я полагаю, я буду голосовать за него :-)

#include <stdio.h> 

int main(){ 
    char str[20]; 
    int skip = 0; 
    str[19] = 1; 
    while (fgets(str, 20, stdin)) { 
     // just ignore lines of more than 19 chars 
     if (str[19] == 0){ 
      str[19] = 1; 
      skip = 1; 
      continue; 
     } 
     // also skip the end of long lines 
     if (skip) { 
      skip = 0; 
      continue; 
     } 
     // monitor input 
     puts(str); 
     // stop on any line beginning with 'q' 
     if (str[0] == 'q'){ 
      break; 
     } 
    }; 
} 
0

Посмотрите fpurge:

fpurge(stdin); 
+1

... который нестандартный ... – DevSolar