C, промывка стандартного ввода - PullRequest
4 голосов
/ 06 октября 2010

У меня проблема с использованием fgets.Цикл должен прочитать строку макс.19 символов, проанализируйте этот массив символов и дождитесь следующего ввода.Проблема состоит в том, что если введенная строка превышает 19 символов, fgets заполнит оставшиеся символы до тех пор, пока не будет введен Ctrl-D или новая строка, что инициирует новый цикл без нового ввода.После прочтения 19 символов ввод (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                                //

Ответы [ 5 ]

4 голосов
/ 06 октября 2010

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

2 голосов
/ 06 октября 2010
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 голосов
/ 21 октября 2010

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

fpurge(stdin);
0 голосов
/ 07 октября 2010

Еще один возможный вариант с ограничением 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 голосов
/ 06 октября 2010

Попробуйте:

fgets(str, 2000, stdin)

Затем обрежьте строку до 19: -)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...