2016-08-04 276 views
4
#include <stdio.h> 
int main() 
{ 
    char name[10]; 
    for(int i=0;i<=10;i++) 
    { 
    printf("Who are you? "); 
    if(fgets(name,10,stdin)!=NULL) 
    printf("Glad to meet you, %s.\n",name); 
    } 
    return(0); 
} 

当我输入大于10个字符的东西时,循环跳过。在C中的fgets()后清空输入缓冲区

Who are you? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa 
Glad to meet you, aaaaaaaaa. 
Who are you? Glad to meet you, aaaaaaaaa. 
Who are you? Glad to meet you, aaaaaaaaa. 
Who are you? Glad to meet you, aaaaaaaaa. 
Who are you? Glad to meet you, aaaaaaaaa. 
Who are you? Glad to meet you, aaaaaaaaa. 
Who are you? Glad to meet you, aaaaaaa 

我想我想从其余字符清除输入缓冲区。什么是最好的方式来做到这一点...?

回答

5

检查是否存在换行name

#include <stdio.h> 
#include <string.h> 

int main(void){ 
    char name[10]; 

    for(int i=0;i<=10;i++){ 
     printf("Who are you? "); 
     if(fgets(name,10,stdin)){ 
      char *p; 
      if(p=strchr(name, '\n')){//check exist newline 
       *p = 0; 
      } else { 
       scanf("%*[^\n]");scanf("%*c");//clear upto newline 
      } 
      printf("Glad to meet you, %s.\n", name); 
     } 
    } 
    return(0);//Parentheses is not necessary 
} 
+1

用好scanf函数的'(“%* [^ \ n]”)长度的字符; scanf函数(“% *');''而不是不正确的'scanf(“%* [^ \ n]%* c”);' – chux

1

从文档fgets(重点煤矿):

读取来自流的字符,并将它们存储为C字符串到STR 直到(NUM-1)的字符已被读出或任一换行或 已到达文件结尾,以先发生者为准

因此,您的输入(超过缓冲区)以9个字符(+1 null-terminating char)的块读取。

您需要反复调用fgets,直到最后一个读取的字符为换行符(\ n)。

+0

的问题是喜欢它将使到达时,等待在限制进入.. – Nikhil

1

你需要寻找使用类似下面这样的\n

/* flush unread input buffer */ 
while(! strchr(name, '\n')) 
    if(! fgets(name,(sizeof name),stdin)) 
     break; 

注:不知道你是否认为这是一个错误或特性,但是短名称将包括最终\n。结果如下:

Glad to meet you SSS 
. 
+0

这是一个好主意,除了额外调用'fgets()'会更好IMO),使用不同于'name []'的缓冲区。 OTOH @Nikhil George在这种情况下并不清楚名称[]的内容。 – chux

2

检查fgets()是否获得了'\n'。如果没有'\n',则当前行中的某些字符尚未被读取。你可以简单地忽略它们。

printf("Who are you? "); 
    if (fgets(name, 10, stdin) != NULL) { 
     if (!strchr(name, '\n')) { 
      // consume rest of chars up to '\n' 
      int ch; 
      while (((ch = getchar()) != EOF) && (ch != '\n')) /* void */; 
      if (ch == EOF) /* input error */; 
      printf("Glad to meet you, %s.\n", name); 
     } else { 
      printf("Glad to meet you, %s.", name); // name includes ENTER 
     } 
    } 
+0

不清楚为什么'if(ch == EOF)'被认为是一个错误,因为它可能很简单就是'stdin'被关闭了。 (例如,重定向输入:'program_foo chux

+1

@chux:你可以检查'ferror()'和/或'feof()'以确保。对我来说,一行包含了ENTER。如果文件中的最后一个字符不是“\ n”,那么该文件将以非线条结束。 – pmg