2011-11-04 74 views
0

以前我是C程序員(想知道更多關於系統編程的知識,但不想進入彙編,所以我選擇C),但後來在我的大學I必須採取C++,我實際上很難使用cincout對象,因爲它與我信任的printf(),scanf(),getchar()宏相比有一些變化。這是代碼。使用cin對象進行輸入驗證並清除緩衝區(C++)

守則

int main(void) 
{ 
    using namespace std; 

    cout << "What is the number?\n\n"; 
    cout << "#Number :"; 
    cin >> num; 

    while(cin.fail()) 
    { 
     cin.clear(); 
     cin.ignore(1000 , '\n'); 
     cout << "Please enter a number\n\n"; 
     cout << "#Number :"; 
     cin >> num; 
    } 

    return 0; 
} 



問題

1)我想這個代碼,請從用戶(小於號和大於或等於0),當用戶輸入一個字符或字符串時,我希望它提醒用戶,清除輸入緩衝區並重新提示用戶輸入新的值e直到它是一個數字。

2.)所以我只是用google搜索並找到一個頁面傳播方法,所以我只是按照方式,但它失敗了。我不知道爲什麼一旦我運行這個代碼,鍵入一個字符它將導致無限循環的輸出Please enter a number。在這段代碼中我犯的任何錯誤?

謝謝你花時間閱讀我的問題

P/S:我使用的代碼塊與MinGW的編譯器。

回答

2

你不會說它是如何失敗的,所以很難說你的問題 是什麼。事實上,你永遠不會聲明num是一個明顯的問題。如果輸入的行長度超過1000個字符,它也會失敗。

C++中更習慣的解決方案是逐行讀取輸入,使用std::getline,然後使用std::istringstream將行轉換爲數字。

+0

好的,謝謝,無論如何,在原始的源代碼,我確實聲明:)只是在這裏我忘了添加行 – caramel1995

0

使用格式輸入的標準方式是在對操作本身的條件檢查中。另外,您需要閱讀整行內容並嘗試解析該標記,而不是通過標記提取標記。例如。像這樣:

int num; 

for (bool success = false; !success;) 
{ 
    std::cout << "Please enter a number: "; 

    std::string line; 
    if (std::cin >> line) 
    { 
    std::istringstream iss(line); 
    if (iss >> num) success = true; 
    } 

    if (!success) { std::cout << "Error!\n"; } 
} 

std::cout << "Thank you. You said: " << num << std::endl; 

隨意在錯誤分支中添加進一步的診斷輸出。