C,冲洗stdin

时间:2010-10-06 19:16:32

标签: c stdin

我对使用fgets有疑问。该循环应该读取一行最大值。 19个字符,分析此char数组,然后等待下一个输入。 问题是如果输入的行输出19个字符,fgets将用剩余的字符填充str,直到输入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 个答案:

答案 0 :(得分:4)

scanf("%*[^\n]\n");可能是最简单的可能性之一。

答案 1 :(得分: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;
}

答案 2 :(得分:0)

另一个可能的变量,fgets()的约束是唯一使用的输入和循环级别。这绝对与larsman提出的非常相似。所以我想我会投票给他: - )

#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;
        }
    };
}

答案 3 :(得分:0)

看看fpurge:

fpurge(stdin);

答案 4 :(得分:-1)

尝试:

fgets(str, 2000, stdin)

然后将str截断为19: - )