我是C的初学者,我正在编写一个将美元兑换成欧元的基本程序。由于某种原因,程序没有运行这一行:“scanf(”%c“,& yn);”。如果我删除do while循环,程序运行正常。
而不是停止并等待用户输入'y'或'n',循环重新启动并再次请求美元金额。
#include<stdio.h>
main()
{
float usd = 0.00;
float euro = 0.00;
char yn;
const float conversion = 0.75;
do {
/*get amount to convert*/
printf("Please enter the amount of USD you want to convert to Euros: ");
scanf("%f", &usd);
/*convert amount*/
euro = (usd * conversion);
/*output results and ask to continue*/
printf("\n%.2f USD equals %.2f Euros. Do you want to convert another amount? (y/n): ", usd, euro);
scanf("%c", &yn);
printf("\n");
/*if yes, get new amount to convert. if no, program ends*/
} while (yn = 'y');
return 0;
}
提前致谢。
答案 0 :(得分:4)
do {
// ...
} while( yn == 'y'); // At this statement you are making an assignment,
// not comparison. Use the equal to operator.
答案 1 :(得分:4)
您的scanf正在读取以前读取浮动的换行符。您需要考虑新行,scanf(" %c", &yn);
应该有效。即使您输入'y'或'n',评估也会失败,因为您要将'y'
分配给yn
总是评价为真。将其更改为while( yn == 'y')
。
答案 2 :(得分:2)
您需要将yn = 'y'
更改为yn == 'y'
。在第一种情况下,您将设置为'y'
,而您想要做的是将与'y'
进行比较。 ==
运算符用于比较。
答案 3 :(得分:2)
您打算在==
条件中执行while
,而不是单=
,这将始终如实地进行评估。
答案 4 :(得分:1)
在%c
之前的第二个scanf中添加一个空格,如scanf(" %c", &yn);
。
还要回答这个问题,与你的问题非常相似:
Noticing strange behavior with strings in c
另外正如其他人所指出的那样:
while (yn = 'y');
将是(yn == 'y')
答案 5 :(得分:0)
而(yn ='y')应为while(yn == 'y')
答案 6 :(得分:0)
你已经注意到了,并且理解了这个愚蠢的错误,然而,这是一个非常常见的错误,并且很难追踪,因为赋值操作总是返回正确的赋值。有两种方法可以最大限度地减少这种错误的可能性。第一种是使用#define equals =
。
另一个是两个总是取代比较的顺序。因此yn == 'y'
将成为'y' == yn
。这样,如果错误地将==替换为=,则会出现编译错误。
我不知道一个人没有找到这个错误......
答案 7 :(得分:-1)
正如其他人所指出的,问题在于你不小心写了一个赋值语句而不是相等的测试。我们都做到了。
但是在旁注中,作为初级C程序员,您可能会遇到建议,告诉您在相等测试中切换操作数的顺序(如果您犯同样的错误,将导致编译错误),或者#define EQUALS(或者,相关主题,TRUE和FALSE)。这是非常糟糕的建议。
反转操作数的顺序会使代码更难读取,因为您实际上并不想将常量与变量进行比较,而是希望将变量与常量进行比较。 (另外,如果你要比较两个变量,它将毫无帮助。)使用#defines也会使代码混乱无关紧要。 C中没有布尔数据类型,C确实具有类似命名的赋值和相等运算符。
更好的建议是学习语言,而不是试着让它看起来像是不是。