跳过fgets()

时间:2011-09-01 21:41:36

标签: c scanf

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

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()放在fgets()前的订单,但无济于事。

2 个答案:

答案 0 :(得分:4)

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

根据上面的评论,请查看C FAQ中Question 12.18a的答案。

答案 1 :(得分:3)

scanf可能不是在行的末尾吃回报,所以它被传递给第一个fgets。就个人而言,我讨厌scanf - 最好使用fgets,然后使用sscanf解析该行。