2011-10-07 146 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