2012-09-14 46 views
0

我試圖驗證輸入到雙變量的字符是正確的數據類型。循環錯誤試圖驗證有效輸入在C++中加倍

double number = 0; 
int validCheck = 0; 
char another = 'y'; 

while(another == 'y') 
{ 
    cout<<"Please enter a number: "; 
    validCheck = scanf("%lf", &number); 

    while (validCheck !=1) 
    { 
     cout<<"Invalid input, please enter a number: "; 
     validCheck = scanf("%lf", &number); 
    } 

當我編譯此,它工作正常提供我給出一個有效的輸入和無效的輸入並把它放到while循環,而不是檢查另一個輸入,它只是修建垃圾我的控制檯「無效輸入,請輸入一個數字:「甚至不需要新的輸入。我錯過了什麼?

+0

嘗試在while()之後插入以下內容:fflush(stdin); – FacundoGFlores

+4

這真是一個C問題。一些cout語句不會使它成爲C++。 facunvd是正確的,你必須刷新輸入。 –

+0

@facunvd - 在stdin上做一個fflush是未定義的。作爲解決方案提供這是一個可怕的建議。參見C FAQ的12.26a。 –

回答

2

無效輸入保留在輸入緩衝區中,所以scanf總是顯示相同的格式錯誤的輸入。您需要清除輸入緩衝區,例如

int c; 
do { 
    c = getchar(); 
}while(c != '\n' && c != EOF); 
+0

帶了我一下,看看你在做什麼......我想。這會設置一個整數c,並從緩衝區中拉出,直到緩衝區爲新行或文件結尾? –

+0

對。它打算清空緩衝區,因爲終端在輸入換行符後將輸入發送到進程,如果找到一個換行循環,則清空循環停止。 'c'必須是'Int'而不是'char'才能夠測試'EOF'。當然,如果實際遇到'EOF'條件,就不能再從'stdin'中讀取任何東西,所以你應該退出(EXIT_FAILURE)或其他東西以避免陷入無限循環。 –

+0

這很好,現在我明白了,現在就可以使用它了。雖然...從與我的導師交談,我認爲我會更好地使用字符串,並檢查它是否是一個int ... 另一方面,我們的指示是「只假設用戶會輸入一個數字「這一直是我自己的受虐狂運動;)感謝您的幫助! –