2016-02-28 47 views
-5
printf("Give name: "); 
fgets(name, 50, stdin); 
printf("Give surname: "); 
fgets(surname, 50, stdin); 

所有这一切都是在一个循环及以后的第一次,它打印命令给名字,那么完全跳过它,并打印命令给姓。循环是无止境的,而(在我的代码它与断裂出来;和一小会儿后,结束):2与fgets一前一后,第一个被后第一时间跳过

while (1) { 
    printf("Give name : "); 
    fgets(name, 50, stdin); 
    printf("Give surname: "); 
    fgets(surname, 50, stdin); 
    printf("Give ID: "); 
    scanf("%d", &ID); 
} 

而且namesurname是数组。为什么跳过第一个名字?

编辑:

你是对的。下面我有一个scanf他们的ID号码,完全忘了用getchar摆脱\n这个角色。感谢您的快速回复。

+2

你在干什么* *前的循环?您是否在使用例如'scanf'读取其他一些输入? –

+1

最有可能的原因是,您的实际循环包含更多未在此处发布的代码。请仅发布您测试过的代码。 – interjay

+4

欢迎来到Stack Overflow!你介意创建一个[___MCVE___](http://stackoverflow.com/help/mcve)? –

回答

2

发布似乎并不存在重大问题的代码,但是有问题:

  • scanf("%d", &ID);的调用,为你不检查的成功,叶stdin挂起换行。
  • 您不测试fgets()的返回值。它在文件结尾处返回NULL。如果你不休息的话,你会得到一个无限循环。
  • 您的C库可能无法清除输出之前stdinfgets()。这可以解释这种行为。加入fflush(stdout);呼吁解决这个问题:

    for (;;) { 
        printf("Give name : "); 
        fflush(stdout); 
        if (!fgets(name, 50, stdin)) 
         break; 
        printf("Give surname: "); 
        fflush(stdout); 
        if (!fgets(surname, 50, stdin)) 
         break; 
        printf("Give ID: "); 
        fflush(stdout); 
        if (scanf("%d", &ID) != 1) 
         break; 
        scanf("%*[^\n]"); /* consume extra characters on line, if any */ 
        scanf("%*c");  /* consume the linefeed */ 
    }