2014-02-12 50 views
0

我的程序任務是編寫一個計算美元到歐元的循環程序。我的代碼看起來像這樣我的C while while循環不會執行

#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它只是退出。

+3

你可能想嘗試打印again'的'值。在這種情況下,如果它是空格(或者說,來自之前輸入的換行符),它將有助於用字符包圍它。 'printf(「again:[%c] \ n」,again);' – indiv

+0

我會在哪裏添加它?而不是說「另一個量(y/n)?」 另外,在Do語句或While語句中? – user3303994

+0

好吧,讓我們從邏輯上思考這個問題。你想打印'again'的值來查看'while'語句中正在測試的字符,對嗎?你想這樣做是因爲你的'while'陳述並沒有做你認爲應該做的事情。所以在我看來,你要遵循的步驟是:1.將值讀入'again'中。 2. *然後*在'while'語句中測試之前將其打印出來。你建議的方式是打印'again'的值,然後從用戶那裏讀取它。我不認爲這會起作用。 – indiv

回答

0

這是因爲有流浪\ r和或\ n在你輸入流(標準輸入),左是由scanf函數讀取並且離開做的同時,將其替換您的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

+0

有些人使用fflush(stdin),這是根據c標準將有「未定義的行爲」,因此我不會推薦它。 – Sundar

0

我認爲你必須使用STRCMP更多的信息()她即

while (strcmp(again, 'y') == 0 || strcmp(again, 'Y') == 0) 

我大約兩週的時間學習C很抱歉,如果它不工作!

+0

不,'strcmp'用於比較'char'數組又名「C string」。在這種情況下,你需要再次比較一個'char'變量,所以'=='就足夠了。 – nodakai

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函數並不需要空格字符。比如換行符,空格等等,當你按下輸入'USD'時取值,'再次'取走換行符。希望這可以幫助。 :)

0

stdin(標準輸入)還有一個字符,你錯過了,就在你要求美元金額之後,那個角色並不簡單,事實上它等着你把它拉出來,這就是你對最後的scanf所做的。發生這種情況是因爲你告訴scanf(第一個)只讀取了float(雙數)數字,而沒有其他數字。

要查看發生了什麼,可以按照個人的說法檢查變量again的值。雖然最好打印ASCII值而不是字符本身,因爲您可能無法確切知道它是否爲空格,換行符,製表符或任何其他此類字符。

,而不是嘗試這個辦法:

printf("ASCII: %d, CHAR: %c\n", again, again); 

把那最後scanf後行權。

無論哪種方式,你的問題是找到一種方法來放棄最後一個字符。一種解決方案可能是從stdin讀取一個字符串,然後使用atof()將該字符串轉換爲十進制數字。

1

正如其他人已經解釋,你的問題是由於\n保留在STDIN。

爲了跳過它,只需更換

scanf_s("%c", &again); 

scanf_s(" %c", &again); 

這是scanf部分的功能:

空白字符:空白(' 「);標籤('\ t');或換行符('\ n')。一個空白字符會導致scanf讀取輸入中的所有連續空格字符,但不會存儲下一個非空白字符。格式中的一個空白字符與輸入中的任意數字(包括0)和空白字符的組合匹配。

http://msdn.microsoft.com/en-us/library/kwwtf9ch.aspx

關於你的第scanf

scanf(" %lf", &USD); 

也可能會有幫助。

0

變化

scanf_s("%c", &again); 

scanf_s("%c", &again, 1);