2 fgets一个接一个,第一次跳过第一次

时间:2016-02-28 13:10:06

标签: c

printf("Give name: ");
fgets(name, 50, stdin);
printf("Give surname: ");
fgets(surname, 50, stdin);

所有这一切都在循环中并且超出第一次,它打印命令以给出名称,然后完全跳过它并打印命令给出姓氏。循环是无止境的(在我的代码中它有一个带有中断的东西;它会在一段时间后结束):

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个字符。感谢您的快速回复。

1 个答案:

答案 0 :(得分:2)

发布的代码似乎没有重大问题,但仍存在问题:

  • scanf("%d", &ID);的来电,您未检查成功,会在stdin中留下待处理的换行符。
  • 您不测试fgets()的返回值。它在文件末尾返回NULL。如果你不打破那么你会得到一个无限循环。
  • stdin中阅读fgets()之前,您的C库可能无法刷新输出。这可以解释这种行为。添加对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 */
    }