2011-09-28 49 views
1

我試圖編寫一個代碼,要求我逐個輸入數字,並在插入某個字符時(在本例中爲'x')它會停止循環。但是當我插入該字符時,它會以「插入號碼」開始發送垃圾郵件。我認爲,錯誤是我試圖在int數組中插入一個char,但我想不出一個辦法。C++插入數字,直到某個符號

long int numbers[100]={0}; 
char h='y'; 
int index=0; 
do 
{ 
    cout << "Insert Number : "; 
    cin >> numbers[index]; 
    h=(char)numbers[index]; 
    index++; 
} 
while(h!='x'); 
+1

讀一個字符串,然後你會知道該怎麼做。 –

+0

垃圾郵件在這種情況下意味着什麼?你遇到無盡的循環? – arne

+0

您無法將字符讀入整數。試着用相反的方式來做。 – mydogisbox

回答

0

你應該寫一個循環爲:

while(cin >> numbers[index]) 
    index++; 

它會讀取所有的整數,直到你輸入一些無效的輸入,無論是'x'或任何其它字符。現在,如果你想跳過所有無效的投入,並繼續閱讀整數(這可能是無效輸入後),並希望只考慮'x'從環退出,然後再包上面的循環與另一個循環爲:

char ch; 
do 
{ 
    while(cin >> numbers[index]) 
     index++; 
    cin.clear(); //clear the error flags, so you can use cin to continue reading 
    cin >> ch; //read the invalid character 
} while(ch != 'x'); 

一條建議:比long int numbers[100]更喜歡使用std::vector<long int>。如果用戶輸入的整數多於100,那麼你的程序將被破壞。

+0

@這有未定義的行爲(但可能永遠循環);一旦內循環失敗,'cin'處於錯誤狀態,必須在接受任何進一步輸入之前將其清除。 –

+0

@JamesKanze:謝謝。我忘了那個。 :-) – Nawaz

2

發生這種情況是因爲'x'不是一個數字,並且cin >> numbers[index];操作失敗,而沒有使用該數據。所以循環繼續,獲得相同的x,再次失敗,一切都從頭再來。您可以檢查輸入的操作,像這樣的結果:

#include <iostream> 

using namespace std; 

int main() 
{ 
    long int numbers[100]={0}; 
    char h='y'; 
    int index=0; 
    do 
    { 
     cout << "Insert Number : "; 
     if (cin >> numbers[index]) 
     { 
      h=(char)numbers[index]; 
      index++; 
     } 
     else 
     { 
      cout << "Hey, that was not a number! Bye." << endl; 
      break; 
     } 
    } 
    while(h!='x'); 
} 
+0

你寫這個的方式,如果用戶在120中輸入(因爲將120賦值給一個字符給出'x'),它將退出。 –

+0

@EdwardLoper:是的。但我沒有寫出:)所有這個'x'的故事是一個壞主意。 – 2011-09-28 16:46:14

0

因爲你想在一個整數讀取,這不是一個數字不能轉換爲數字,將堵塞的任何字符注入輸入 - 你會得到一個錯誤,並不會從流中刪除壞字符。當你下次嘗試閱讀時,你會得到同樣的錯誤。

0

如果你希望一個數字或字符串,總是讀取輸入的字符串,並試圖將其轉換爲一個數後,如果該字符串不是「X」:

#include <vector> 
#include <string> 
#include <sstream> 
#include <iostream>  

int main(int argc, char *argv[]) 
{ 
    std::vector<long int> numbers; 
    std::string line; 
    while(std::getline(std::cin, line) && line != "x") { 
     std::istringstream input(line); 
     long int value; 
     // Check that there is only a number with nothing else after 
     if((input >> value) && input.get() == std::char_traits<char>::eof()) { 
      numbers.push_back(value); 
     } else { 
      std::cout << "Invalid Entry, please retry" << std::endl; 
     } 
    } 

    //... 

    return 0; 
}