在C中执行while循环时遇到问题

时间:2011-10-07 18:46:39

标签: c loops scanf

我是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;
}

提前致谢。

8 个答案:

答案 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确实具有类似命名的赋值和相等运算符。

更好的建议是学习语言,而不是试着让它看起来像是不是。