清除stdin缓冲区?

问题描述:

我正在写一些代码并使用fgets来获取用户输入。然后,我写了一个循环遍历我的代码,不断询问用户输入,直到用户打印退出。但第二次询问时,它写了“请输入您的输入”2次而不是1次,并且没有第一次等待我的输入。 所以,我GOOGLE了它,发现stdin缓冲区被填充,它必须被清除。 我发现这个解决方案:清除stdin缓冲区?

void dump_line(FILE * fp) { 
    int ch; 
    while ((ch = fgetc(fp)) != EOF && ch != '\n') { 
     /* null body */; 
    } 
} 

,然后从主函数调用:

dump_line(stdin); 

我有一个非常很难理解它。据我了解,它只是分配“ch”fgetc(stdin)的值..我简直不能理解如何将fgetc(stdin)分配给“ch”清除缓冲区。 非常感谢您的帮助!

它简单地分配“CH”龟etc(标准输入)的值

调用fgetc具有副作用一个字符被读取并从该文件流中除去

+0

呵呵,没关系,我不知道为什么教程完全忘记提到它。 谢谢:d – geekkid 2012-02-26 22:29:18

fgetc()从缓冲区中获取字符。此代码从缓冲区中读取字符,直到达到文件结尾或换行符为止。

这是相同的循环,但有不同的写法,也许这将解释它:

void dump_line(FILE * fp) { /* dump a line from fp */ 
    int ch; /* temporary storage for character */ 

    while (1) { 
     ch = fgetc(fp); /* read char from fp, this removes it from the stream */ 

     if (ch == EOF) /* break if we reached END-OF-FILE */ 
      break; 

     if (ch == '\n') /* break if we reached a newline, because */ 
      break;  /* we have succesfully read a line */ 
    } 
} 

分配fgetc(stdin)ch是不是清除缓冲区。这是fgetc(stdin)这样做。每次调用(因此,循环的每次迭代)都会从stdin消耗一个字符。

工作原理:

  1. 呼叫fgetc(stdin),并将结果分配给ch
  2. 如果ch不等于或者EOF'\n',去1

当循环停止,两件事情之一将是真实的:要么你刚刚吃过这标志着结束的字符当前行(请阅读:您现在位于下一行)或stdin为空,您将不会再获得任何输入。 (后者在交互式应用程序中是非常不寻常的,但当人们将东西从别处输入到应用程序时很常见)。

这是我用于用户输入的旧片段,如果我真的需要做它在纯C:

int get_line(char *buffer, int bsize) 
{ 
    int ch, len; 

    fgets(buffer, bsize, stdin); 

    /* remove unwanted characters from the buffer */ 
    buffer[strcspn(buffer, "\r\n")] = '\0'; 

    len = strlen(buffer); 

    /* clean input buffer if needed */ 
    if(len == bsize - 1) 
     while ((ch = getchar()) != '\n' && ch != EOF); 

    return len; 
} 

它检索bsize量的从stdin并将其存储到给定的缓冲区字母。 留在标准输入缓冲区中的东西将自动清除。它还从输入数据中删除换行符(\ r和\ n)。

函数返回成功读取的字符数量。

清除缓冲区又如:

char ch[1]; 
while(1){ 
    ch[0] = fgetc(stdin); 
    if(ch[0] == '\n' || ch[0] == EOF) break; 
}