我写了一个简单的程序来交换货币并且能够买到啤酒。
但是在程序中有一些东西,我不知道为什么,它会自动跳过第三个输入数据 - >结束计划。
这是我的代码:
#include <stdio.h>
#include <stdlib.h>
int main()
{
int ex_rate_into_vnd = 20000; //! Exchange Rate
int beer = 7000; //! Local price of a beer
float in_c = 0; //! Input amount of money
float out_c = 2; //! Amount of currency to exchange !
float choice; //! Switch mode
char buy; //! Deal or not
//! Introduction
printf ("||---------------------------------------------------||\n");
printf ("|| Currency Exchange Machine beta ||\n");
printf ("||---------------------------------------------------||\n");
printf ("Please choose your option:\n");
printf("\t 1.Exchange VND to dollar\n");
printf("\t 2.Exchange Dollar to VND\n");
do
{
printf("Your choice: ",choice);
scanf("%f",&choice);
} while( choice != 1 && choice != 2);
printf ("Please enter amount of money:");
scanf("%f",&in_c);
if (choice == 1 )
{
out_c = in_c / ex_rate_into_vnd;
printf ("Your amount of money: %.2f",out_c);
}
else
{
out_c = in_c * ex_rate_into_vnd;
printf ("Your amount of money: %.0f",out_c);
}
//! End of Exchanging
printf ("\nWould you like to buy a beer (y/n) ?",buy);
scanf("%c", &buy);
if (buy == 'y')
{
if (out_c >= 7000)
{
out_c = out_c - 7000;
printf("Transactions success !\n");
printf("Your amount: %2.f",out_c);
}
}
printf ("\nWhy Stop ?");
return 0;
}
答案 0 :(得分:2)
在最新的float条目和您想要阅读的\n
之间至少有一个char
。你需要先摆脱它。
答案 1 :(得分:2)
更改
scanf("%c", &buy);
到
scanf(" %c", &buy);
// ^space
因为输入数字后输入缓冲区仍然在输入缓冲区中,并在第二个scanf
中按ENTER键。
答案 2 :(得分:2)
而不是scanf("%c", &buy);
1.在%c之前使用空格
scanf(" %c",&buy); //space before %c
^
这会跳过空白区域(包括换行符)。
2.或使用getchar();在scanf之前(“%c”,&amp; buy);声明
getchar(); //this hold the newline
scanf("%c", &buy);
3.或使用两次getchar();
getchar();
buy=getchar();
//here getchar returns int , it would be better if you declare buy with integer type.
在GCC中,不鼓励使用fflush(stdin);
。请避免使用它。
答案 3 :(得分:0)
我想知道为什么你让'选择'成为一个浮点数,而不是一个int 另外,请考虑使用开关盒 这样,您就不必进行整个do-while循环。 另外,在行 printf(“\ n你想买啤酒(是/否)?”, 购买 ); 你为什么加了? 这就是我要做的事情:
printf("Your choice?\n>");
scanf("%d", &choice);
switch(choice)
{
case 1 :
{
out_c = in_c / ex_rate_into_vnd;
printf ("Your amount of money: %.2f",out_c);
}
case 2:
{
out_c = in_c * ex_rate_into_vnd;
printf ("Your amount of money: %.0f",out_c);
}
default :
printf("\nThere has been an error\n"):
reloadprogram(); /* Reloadprogram() is simply to make this go back to the asking thing :) */
}
}
编辑:同样,它说if( <somevariable> >= 7000)
,将7000更改为啤酒,这样,如果你改变啤酒,你将不必改变它:)
答案 4 :(得分:0)
使用fflush(stdin)清除最后一次scanf之前的输入
答案 5 :(得分:0)
程序不跳过第三个输入数据,只扫描第二个输入后按下的换行符。要解决此问题,请键入scanf("%*c%c", &buy);
而不是scanf("%c", &buy);
。这个小%*c
扫描并忽略从输入中读取的字符。
答案 6 :(得分:-1)
你可以从printf调用中删除buy
变量,这是不需要的
printf ("\nWould you like to buy a beer (y/n) ?",buy);
将char buy
替换为char buy[2];
。因为/0
总是终止刺痛。
您还可以添加memset (buy, 0, sizeof(buy))
,以确保在开始使用之前重置内存。