2011-10-07 215 views
1

我是C的初学者,我正在编写一个将美元转换为欧元的基本程序。由于某种原因程序没有运行这一行:“scanf(”%c“,& yn);”。如果我删除while while循环,程序工作正常。在C中循环时遇到麻烦

而不是停止并等待用户输入“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; 
} 

在此先感谢。

+2

是什么让你说“该程序没有运行这条线”?它最cetainly *是*运行该行。也许你应该从'scanf'打印返回值,并将值写入'yn'中以确定发生了什么。 (提示:'yn'将等于'\ n''。) –

回答

4
do { 
    // ... 
} while(yn == 'y'); // At this statement you are making an assignment, 
        // not comparison. Use the equal to operator. 
+0

这只是为什么它循环播放并再次提示美元的原因。主要问题是程序甚至不提示'y''n'字符输入。 – Joe

2

您需要将yn = 'y'更改为yn == 'y'。在第一种情况下,你是设置 yn到'y'而你想要做的是比较它到'y'==运算符用于比较。

2

你的意思做==while条件,而不是一个单一的=,将始终如实评价。

0

而(炔= 'y')的同时(炔== 'y')的

4

你的scanf从先前读浮子拾取换行符应。您需要考虑新行,scanf(" %c", &yn);应该可以工作。即使您输入'y'或'n',评估也会失败,因为您将'y'指定为yn,因此总是会评估为true。将其更改为while(yn == 'y')

1

%c这样的scanf(" %c", &yn);之前给第二个scanf中的空格。

同样经历了这个问题,十分类似于您的问题:

Noticing strange behavior with strings in c

另外,作为被别人指出:

while (yn = 'y');会(YN == 'Y')

0

你已经注意到了,并且理解了这个愚蠢的错误,但是,这是一个非常常见的错误,并且很难追踪,因为赋值操作总是返回赋值的正确值。有两种方法可以最大限度地减少发生此类错误的几率。首先是使用#define equals =。 另一个是两个总是替换比较的顺序。所以yn == 'y'将变成'y' == yn。这样,如果错误地将==替换为=,则会出现编译错误。 我不知道一个人谁也没有绊倒这个bug ...

-1

正如其他人指出的,问题是,你意外地写了一个赋值语句,而不是平等测试。我们都做到了。

但是作为初级C程序员,您可能会遇到一些建议,告诉您在平等测试中切换操作数的顺序(如果您犯了同样的错误,将会导致编译错误),或者#定义EQUALS(或者,在相关主题上,TRUE和FALSE)。这是非常糟糕的建议。

颠倒操作数的顺序会使代码难以阅读,因为您实际上并不想将常量与变量进行比较,您想将变量与常量进行比较。 (另外,如果你正在比较两个变量,它根本无济于事。)使用#define也会使代码变得无关紧要。 C中没有布尔数据类型,C有类似的命名赋值和相等运算符。

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

+0

我不是downvoter,虽然你对#defines是正确的,但是你没有把常数放在左边比较。 = vs ==问题是c中的一个可用性问题,可用性问题在各个层次上都是真实的。即使是像你这样的专家。这种习惯在这个语言的可用性中'编码'这个'错误'。诚然,它不适用于变量,但这是一个'可能性'的事情,给自己更好的成功机会==通常是生活中任何角落的一个非常好的主意。假装你是正确的不是。尤其是当你可以解决你知道的无法访问的问题时 – FastAl

+0

好吧,这不是一场辩论,所以我不会重复我以前的,但我会补充说,这种问题是为什么会有编译器警告:gcc -Wall会抓住'if (c = 1)'嫌犯。当然,我们遇到了“编译器给出了太多警告,所以我把它们关掉”的东西,对我来说,这相当于医生说:“X射线显示骨折太多,所以我忽略它,给病人一个创可贴。”就良好的编码习惯而言,使用警告进行编译比编写反向表达式要好得多。很好地说, – Uffe

+0

无法就警告达成一致。现在,我的腿弯曲在所有错误的地方...... – FastAl