我的程序分配是编写一个循环程序,计算USD到欧元。我的代码看起来像这样
#include <stdio.h>
int main(void)
{
double USD, euro;
char again;
do
{
printf("Please enter the amount of USD you want to convert to Euros> ");
scanf_s("%lf", &USD);
euro=USD * 0.73209;
printf("%4.2f USD equals %4.2f Euros.", USD, euro);
printf("Do you want to convert another amount (y/n)?");
scanf_s("%c", &again);
}
while (again == 'y' || again == 'Y');
return 0;
}
当我运行程序时,它会执行,允许我输入一个美元值,给我正确的欧元值,然后当提示y / n时它就会退出。
答案 0 :(得分:1)
正如其他人所解释的那样,您的问题是由于STDIN中仍有\n
。
为了跳过它,只需替换
scanf_s("%c", &again);
与
scanf_s(" %c", &again);
这是scanf
功能的一部分:
空白字符:空白('');标签('\ t');或换行符('\ n')。空格字符会导致scanf读取但不存储输入中的所有连续空白字符,直到下一个非空白字符。格式中的一个空白字符与输入中的任何数字(包括0)和空白字符组合相匹配。
第一个scanf
,
scanf(" %lf", &USD);
也可以提供帮助。
答案 1 :(得分:0)
这是因为输入流(stdin)中存在杂散的\ r和\或\ n,由scanf读取并退出do,用
替换scanf_s行while((again = getchar()) != '\n' && again != EOF);
如果您想使用scanf_s,那么您可以执行类似
的操作do {scanf_s("%c", &again);}while(again == '\n' || again == '\r');
有关此检查的更多信息http://c-faq.com/stdio/gets_flush2.html
答案 2 :(得分:0)
我认为你必须在这里使用strcmp()。
while ( strcmp(again, 'y') == 0 || strcmp(again, 'Y') == 0 )
我在学习C大约两周时很抱歉,如果它不起作用!
答案 3 :(得分:0)
试试这个。
#include <stdio.h>
int main(void)
{
double USD, euro;
char again;
do
{
printf("Please enter the amount of USD you want to convert to Euros> ");
scanf_s("%lf", &USD);
getchar();
euro=USD * 0.73209;
printf("%4.2f USD equals %4.2f Euros.", USD, euro);
printf("Do you want to convert another amount (y/n)?");
again = getchar();
}
while (again == 'y' || again == 'Y');
return 0;
}
这是因为scanf不占用空白字符。如换行,空格等,当你按下输入'美元'正在取值并且'再次'取得换行符。希望这可以帮助。 :)
答案 4 :(得分:0)
stdin
(标准输入)还有一个你缺少的角色,就在你要求获得美元金额之后,这个角色并不简单,事实上它等着你拉它out,这就是你对上一个scanf
的所作所为。发生这种情况是因为您告诉scanf
(第一个)只读取float
(双)数字而不是其他内容。
要查看正在发生的事情,您可以检查变量again
的值,如indiv所说。虽然最好打印ASCII值而不是字符本身,因为您可能无法确切知道它是空格,新行,制表符还是此类任何其他字符。
而不是试试这个:
printf("ASCII: %d, CHAR: %c\n", again, again);
将该行放在最后scanf
之后。
无论哪种方式,你的问题是找到一种方法来丢弃最后一个角色。一种解决方案是从stdin
读取字符串,然后使用atof()
将该字符串转换为十进制数字。
答案 5 :(得分:0)
更改
scanf_s("%c", &again);
到
scanf_s("%c", &again, 1);