2015-01-13 54 views
0

我想讓用戶輸入一些數據,然後將其存儲在一個結構中,但是我有麻煩知道我應該使用哪個函數,有什麼區別? cin或getline()?無論是我使用的函數,它似乎需要在'\ n'鍵,並使我的程序崩潰,但我不是100%,如果這是問題...因爲它不斷崩潰。C++跳過新的行鍵?

我玩過他們兩個,這是我的。

string temp; 
int id; 

cout << endl << "Full name (last, first): "; 
cin >> temp; 
cin.ignore(1, '\n'); 
myData[fileSize] = parseName(temp); 

cout << endl << "ID: "; 
cin >> id; 
myData[fileSize].id = id; 

cout << endl << "Address: "; 
cin >> temp; 
temp.copy(myData[fileSize].address, temp.length(), 0); 

變量fileSize是數組當前的哪個元素,函數parseName將名稱拆分爲last和first。

我一直在閱讀幾個函數,如cin.ignore()和noskipws,但不知道如何使用它們。順便說一句,用戶輸入數據的方式是「最後,第一次」,後面有一個逗號和空格(這是解析函數正在查找的內容)。

另外我不確定地址部分是否是最好的方法來做到這一點,我有結構myData.address是一個字符數組,因爲我不知道如何處理字符串。我仍然對C++沒有信心。謝謝你的幫助。

編輯:如果我註釋掉ID和地址部分,程序會循環6次說我有一個無效的條目(這是主要部分),所以在按Enter後讀取6或7個鍵。 如果我以一切方式離開,這就是我所得到的。

Full name (last, first): terminate called after throwing an instance of 'std::ou 
t_of_range' 
    what(): basic_string::copy 

This application has requested the Runtime to terminate it in an unusual way. 
Please contact the application's support team for more information. 

Process returned 3 (0x3) execution time : 4.328 s 
Press any key to continue. 
+1

當它崩潰時會發生什麼?請將此設爲[MCVE](http://stackoverflow.com/help/mcve)。 – ryanpattison

+1

你怎麼知道它因爲換行而崩潰?你測試過解析和其他一切嗎?嘗試隔離你的問題。在我眼中,你有3個可能炸燬的地方。還有一個指導如何寫「爲什麼我的代碼不工作」的問題。 – luk32

+1

確保你的地址有足夠的空間來容納你試圖複製到它的地址。 – user2970916

回答

0

您應該使用cin.getline()代替這種情況,並且不需要cin.ignore。

Here is an examination of the two methods -std::cin.getline() vs. std::cin

另外,檢查你PARSENAME功能,並嘗試在隔離測試它沒有任何用戶I/O。

+0

我通過名稱中的硬編碼檢查瞭解析,並且它工作正常。我怎樣才能擺脫'\ n'鍵?因爲所有這一切之前,我有一個cout說如果你想添加一個聯繫人,並且用戶必須按下'Y'鍵,並且我猜測這個函數之前的新行正在導致它被嚇倒。我這樣說是因爲在修改代碼之後,當按'Y'添加聯繫人時,它跳過添加名稱部分並返回到原始循環(所有這些都在地址和ID被註釋掉的情況下) 。 – Maty