2014-10-06 48 views
0

我想編寫一個程序,它接受用戶的輸入並計算三角形數字。還應該有一個選項來詢問用戶他是否想要再次輸入或退出,並且需要使用while或do ... while來完成。我寫了下面的代碼,但沒有做什麼打算:用戶在C++中啓動循環

#include <stdio.h> 
int main(void) 
{ 
    int n, number, triangularNumber; 
    char s = 'Y'; 
    while (s == 'Y') { 
     printf("What triangular number do you want? "); 
     scanf("%i", &number); 
     triangularNumber = 0; 
     for (n = 1; n <= number; ++n) 
      triangularNumber += n; 
     printf("Triangular number %i is %i\n\n", number, triangularNumber); 
     printf("Do you want to continue?\n"); 
     scanf("%c", &s); 
    } 
    return 0; 
} 

上面的代碼只做了一次後,它退出。我如何根據我給的輸入重新運行循環?提前致謝。

+1

當用戶按下'y'時它是否以小寫形式出現?這可能是爲什麼它在1循環後爆炸,如果是這樣的話,你可以很容易地調試它 – EdChum 2014-10-06 13:57:52

回答

1

兩個問題:首先是小寫字母和大寫字母'y' != 'Y'之間的區別。

第二個問題,以及您在這裏看到的是您讀取數字的第一個scanf,它將換行符留在輸入緩衝區中。然後第二個scanf調用讀取該換行符並將其寫入變量s

第一個問題可以很容易地通過確保變量s的內容是一個大寫字母,來解決使用toupper

while (toupper(s) == 'Y') { ... } 

第二個問題,可以很容易地固定通過詢問scanf閱讀並丟棄前導空格時,得到的字符,這樣做是由格式代碼前加上空格:

scanf(" %c", &s); 
// ^
//  | 
// Note space here 
2

scanf("%i",&number);生成一個換行符是消費由您的scanf("%c",&s);
重寫爲scanf(" %c",&s)(在%c之前包含空格)忽略輸入前的所有空白。