【问题标题】:fgets() skipped [duplicate]fgets()跳过[重复]
【发布时间】:2011-09-01 21:41:36
【问题描述】:

我正在为学校编写一个程序,用户输入姓名、工作时间和小时工资。

int main ()
{
    char name[SIZE];
    char selection = 'Z';
    int hoursWorked = 0,
        counter = 0,
        flag = 1;
    float hourlyRate = 0.0;
    const float otRate = 1.5;
    const int week = 40;

    while (flag == 1)
    {
        system ("cls");
        printf ("\n\tP A Y R O L L  P R O G R A M\n");
        printf ("---------------------------------------------\n");
        printf ("\t(A) - New Payroll Info\n\t(B) - Display Payroll\n\t(C) - Quit\n\t");
        scanf (" %c", &selection);
        selection = toupper (selection);
        switch (selection)
        {
        case 'A':
            system ("cls");
            printf ("Enter Employee Name: ");
            fgets ( name, SIZE, stdin );
            strip_newline( name, 50 );
            printf ("\nEnter Hourly Rate: ");
            scanf ("%f", &hourlyRate);
            printf ("\nEnter Hours Worked This Week: ");
            scanf ("%d", &hoursWorked);
            system ("pause");
            break;

SIZE 为 50,包括 stdio.h 和 stdlib.h。当我编译并移动到 A 开关时,它会跳过 fgets() 输入并直接转到 "Enter Hourly Rate: " scanf()。我尝试更改将scanf()s 放在fgets() 前面的顺序,但无济于事。

【问题讨论】:

  • 阅读the c-faq 的第 12 节。而且,既然你已经在那里了,也请阅读其他部分:-)

标签: c scanf


【解决方案1】:

您的scanf 调用在输入缓冲区中留下了换行符。因此,当调用 fgets 时,它会读取该换行符并返回。

根据上面pmg 的评论,请查看C 常见问题解答中Question 12.18a 的答案。

【讨论】:

  • 我的回答是使用 fflush (stdin) 来清除输入缓冲区
  • 我建议不要这样做。 fflush(stdin) 具有未指定的行为...许多编译器会按照您的预期解释它,但有些不会,这可能会导致问题出现。我知道可移植性可能不是学校作业的问题,但坏习惯的形成比消除要容易得多。作为替代方案,我建议用你的 scanf 做这样的事情:
  • scanf(" %c%*[^\n]", &selection); assert('\n' == getchar()); assert 当然是可选的(但 getchar() 不是)。我只是想确定我吃的是换行符,而不是偶然的其他角色。我添加的 %*[^\n] 基本上说“匹配所有不是换行符的内容”([^\n] 模式)“但不要将它分配给任何变量”(这就是 * 所做的)。跨度>
【解决方案2】:

scanf 可能没有吃掉行尾的返回,所以它被传递给第一个 fget。就个人而言,我讨厌 scanf - 最好使用 fgets 然后使用 sscanf 解析行。

【讨论】:

  • 但是在数值数据上使用 sscanf 时要小心;它的溢出行为(例如,使用输入值超过 INT_MAX 的“%d”)是未定义的。
  • @Paul Tomblin - 哦,天哪,我记得这个名字上面有很多非常有趣的 a.s.r 引用。你先生是个传奇:)
  • 谢谢,@Tom。我还在 asr 附近,只是不那么频繁。
猜你喜欢
  • 2014-12-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-22
  • 1970-01-01
  • 2020-08-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多