2011-07-28 48 views
2

只是想比較兩個用戶定義的向量,看看他們是平等的,當前代碼:中而濫用CIN循環對於int分配

vector<int> ivec1, ivec2; //vectors, uninitialized 

int temp1; 

cout << "Enter integers to be stored in ivec1." << endl; 

while(cin >> temp1) //takes input from user and creates new element in the vector to store it 
{ 
    ivec1.push_back(temp1); 
} 

int temp2; 

cout << "Enter integers to be stored in ivec2." << endl; 

while(cin >> temp2) //same as above with different vector 
{ 
    ivec2.push_back(temp2); 
} 

if(ivec1 == ivec2) 
    cout << "ivec1 and ivec2 are equal!" << endl; 
else 
    cout << "ivec1 and ivec2 are NOT equal!" << endl; 

到目前爲止,這讓我賦值ivec1就好了,但作爲我通過輸入一個字母來退出while循環,使cin失敗,它跳過第二個塊。出於好奇心,我試着在第一個while循環之後放入其他cin語句,並忽略它們。

強迫cin失敗會導致程序忽略所有其他呼叫或其他問題嗎?如果是這樣,我怎麼才能讓這個程序做我想做的事?

截圖爲您的觀賞樂趣: http://img695.imageshack.us/img695/2677/cinfailure.png

* PS。有temp1和temp2只是我試圖弄清楚如果使用相同的int爲兩個分配循環導致的問題,無論如何,我只是想我會離開它那裏

回答

3

你將不得不做cin.clear()重置流狀態。然後,您必須確保從流中讀取違規字符(使用here中描述的技術之一),以便下一個輸入操作也不會失敗。

1

你的意思是你做了一個ctrl-D給第一個循環的文件結束。

問題是,一旦EOF達到,它將持續存在,第二個循環也將看到EOF並且從不讀取任何內容。

改爲使用終止字符,如空行或'。'。並專門測試玩具的while循環而不是while (cin >> tmp1)

1

在循環之間使用cin.clear()。該命令將流的狀態重置爲可用狀態。

可能有助於知道您不必始終輸入無效字符來退出循環,也可以在控制檯上使用(在Windows上)ctrl-z(在其他系統上的ctrl-d)刺激EOF。你仍然必須cin.clear()(因爲EOF仍然流無效) - 但它是不是很危險

+0

感謝您對ctr-z的建議,我不知道! – user863492

+0

@Martin:的確如此;但在這種情況下,無論如何都應該從2個獨立的文件中讀取輸入。 – Schnommus

+0

根據兩個EOF創建一個程序,無法從管道中的單個輸入饋送...在很多方面比一個哨兵醜。不幸的是,他最潔淨的哨兵這裏可能是一條空白的路線,爲了檢測它,需要使用getline。一個字符串,然後創建一個istringstream,然後嘗試int解析,並明確檢查行上的尾隨垃圾。 iostreams可能很凌亂! –

0

當由於std::cin失敗第一while退出循環,這也內部設置故障標誌。所有你需要通過編寫以下後的第一while循環,清除標誌:

scin.clear(); 

它清除所有故障標誌,使cin可以用來讀取進一步的輸入。

0

我在解決同樣的問題時發現了這個問題。我必須添加cin.clear()cin.ignore()來重置循環之間的流,並讓它再次識別'cin'調用。