删除scanf()后读取整数的\n。

3

我是初学者,写了很多基础程序。我的新时间表程序有些问题,我想计算总停车费并将其与汽车号码和小时数一起显示在屏幕上。这个序列必须是汽车,小时,收费。 在我的程序中,只有scanf()向用户询问小时数。用户输入小时并回车,程序就会得到新的一行。我希望输出结果像这样:

汽车 小时 收费

Car    Hours     Charge
1       5         3.00

但是程序的输出结果如下:
Car    Hours    Charge
1       5
       3.00

这是我的程序源代码:
#include<stdio.h>

double calculateCharges ( double time1 );

int main( void )
{ //open main

 double time;
int i;
double TotalCharges=0, TotalTime=0;

printf("Car\tHours\tCharge\t\n");

for(i=1;i<=3;i++)   //there is 3 cars checkin
{  //open for

    printf("%d\t",i);
    scanf("%lf", &time);
    printf("\t");

    TotalTime+=time;

    printf("%lf",calculateCharges(time) ); // fonks calculate

    TotalCharges+=calculateCharges(time);  // for total charge

    puts("");

    } // end for
}  // end main

double calculateCharges ( double time1 )
{  //open fonk

    double totalC=0;

if( time1<=3)       // untill 3 hours, for 2 dolars
{   //open if

    totalC+=2.00;

}   //end if

else if(time1>3)      // after 3 hours, each hours cost 0.5 dolars
{    //open else if

    totalC+=2+(time1-3)*0.5;

}    //end else if


return totalC;
} // end fonk

1
如果我将printf("\t");更改为printf("%lf\t", time);,对我来说它可以正常工作。 - Thirupathi Thangavel
我其实是个初学者,不知道如何编写这段代码。请向我解释,是否有简单的解决方案。 - gok
我没有得到你所说的输出。你的输入是什么? - Thirupathi Thangavel
很遗憾,它不起作用。如果我这样做,程序会得到新的一行并再次写入小时数,而在充电和输出之间没有相同的行。 - gok
是的,我的输入在屏幕上。程序调用函数并将计算结果写在屏幕上。 - gok
显示剩余3条评论
2个回答

3
据我所知,这是与终端相关的“问题”。当您在终端中输入内容时,只有在按下回车键后才将输入发送到程序,并且回车键会添加一个新行。
您需要更改终端的行为,以便您输入的所有内容都立即发送到程序。
请查看此问题,顶部答案将向您展示如何做您想要做的事情:如何避免在使用任何getchar()时按回车键

另一种方法是先获取输入,然后当你拥有全部三个输入之后再生成所需的表格。 - valegians
我是初学者,不知道putchar等函数。如果没有简单的解决方案,我会继续自己的方式。也许未来会给我带来新的解决方案 :D - gok
那么我建议的是,只需使用scanf 3次来获取您想要的3个小时(例如time1,time2,time3),然后之后使用printf以您想要的方式输出所有内容。 - valegians
但我希望我的输入可以显示在屏幕上,而不是再次出现在屏幕上。程序调用函数和计算书写在费用下面。 - gok
除非更改您的代码设计或修改输入方式,否则您想要做的方式将无法生效。 - valegians

2
标准的C输入函数只有在按下“回车”键时才开始处理输入。同时,每次按键都会将字符添加到键盘缓冲区中。
因此,当您使用scanf函数时,它不会读取缓冲区,直到按下“回车”键为止。
虽然有解决方法可以绕过这个问题,但并不适用于标准的C库。
祝好! 编辑: 下面的代码不遵循标准的C库。但是,它可以实现你要求的功能 :)
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

double calculateCharges ( double time1 );

int main( void )
{ //open main

    double time;
    int i,j = 0;
    double TotalCharges=0, TotalTime=0;
    char chTime[10];


    printf("Car\tHours\tCharge\t\n");

    for(i=1;i<=3;i++)   //there is 3 cars checkin
    {  //open for

        printf("%d\t",i);

        // Input the time
        j = 0;
        memset(chTime, '\0', 10);

        while ( 1 )
            {
            chTime[j] = getch();

            // User pressed "Enter"?
            if ( chTime[j] == 0x0d )
            {
                chTime[j] = '\0';
                break;
            }

            printf("%d", atoi(&chTime[j]));
            j++;
        }

        // Convert to the correct type
        time = atoi(&chTime[0]);

        TotalTime+=time;

        printf("\t%lf",calculateCharges(time) ); // fonks calculate

        TotalCharges+=calculateCharges(time);  // for total charge

        puts("");

        } // end for
}  // end main

double calculateCharges ( double time1 )
    {  //open fonk

        double totalC=0;

    if( time1<=3)       // untill 3 hours, for 2 dolars
    {   //open if

        totalC+=2.00;

    }   //end if

    else if(time1>3)      // after 3 hours, each hours cost 0.5 dolars
    {    //open else if

        totalC+=2+(time1-3)*0.5;

    }    //end else if


    return totalC;
} // end fonk

你的意思是C语言中没有解决方案,对吗?(我的英语不好,我想确认一下) - gok
请查看我的编辑。如果满足您的需求,请接受我的答案。 - ezFreak
我已经保存了你的项目,但现在我不懂getch()和指针。等我学习了以后,我会回来评论的。谢谢。 - gok

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接