2014-10-08 71 views
0

當我使用getline(cin,variablehere)函數時,我的程序跳過了一些代碼。我不知道代碼有什麼問題。見下面String getline(cin,variable)函數跳過一些代碼行

#include <iostream> 
#include <string> 
using namespace std; 

int main() 
{ 
    string getfirstname; 
    string lastname; 
    string address; 
    int contactnumber; 
    cout << "Enter First name : "; 
    getline(cin, getfirstname); 
    cin.ignore(); 
    cout << "Enter Last name : "; 
    getline(cin, lastname); 
    cin.ignore(); 
    cout << "Enter Address : "; 
    getline(cin, address); 
    cin.ignore(); 
    cout << "Enter Contact number : "; 
    cin >> contactnumber; 
    cin.ignore(); 

    CurrentNumberOfContacts += 1; 
    cout << "Successfully added to contact list!" << endl << endl; 

    cout << "Would you like to add another contact ? [Y/N] "; 
    cin >> response; 

    //more lines of codes below 
    return 0; 
} 

輸出我已經inputed「詮釋」爲數據類型,因爲它包含的數字僅

enter image description here

+0

刪除屏幕截圖並在此輸出 – 2014-10-08 02:25:58

+2

電話號碼不是整數。 – 2014-10-08 02:27:32

+1

你正在使用cin >>聯繫號碼,而不是getline(cin,contactnumber) – 2014-10-08 02:28:38

回答

3

我建議刪除全部cin.ignore()命令。

一個與用戶輸入的問題是這樣的,如果你有一個getline()getline()遵循它會讀取回車符,而不是你想輸入什麼>>運營商不走回車符出流。

所以我會改變所有getline()這樣:

// cin >> ws will skip any RETURN characters 
// that may be left in the stream 
getline(cin >> ws, lastname); 

同時刪除所有cin.ignore()命令。他們在getline()命令之後使用時沒有做任何有用的事情,並且如果您更改您的命令,正如我所顯示的那樣,它們根本不需要。

所以這應該工作:

int main() 
{ 
    string getfirstname; 
    string lastname; 
    string address; 
    char response; 
    int contactnumber; 
    int CurrentNumberOfContacts = 0; 

    cout << "Enter First name : "; 
    getline(cin >> ws, getfirstname); 

    cout << "Enter Last name : "; 
    getline(cin >> ws, lastname); 

    cout << "Enter Address : "; 
    getline(cin >> ws, address); 

    cout << "Enter Contact number : "; 
    cin >> contactnumber; 

    CurrentNumberOfContacts += 1; 
    cout << "Successfully added to contact list!" << endl << endl; 

    cout << "Would you like to add another contact ? [Y/N] "; 
    cin >> response; 

    //more lines of codes below 
    return 0; 
} 

嚴格地說並不是所有的getline()功能需要聘請cin >> ws伎倆。我猜想(不完全)的規則如下:

如果使用std::getline()>>然後使用:

std::getline(cin >> ws, line); 

否則就用:

std::getline(cin, line); 
+0

使用'cin >> lastname'會更簡潔,它會自動忽略空白並且對於典型的輸入案例(每行一個字)具有相同的功能。 – Wug 2014-10-08 02:49:32

+0

@Wug有些名字有空格(例如Mc Manners或Du Val) – Galik 2014-10-08 02:51:26

+0

@Galik噢。我把它與'scanf(「%c」''混在一起。 – 2014-10-08 03:35:35

1

cin >>getline不配合得非常好。他們對於如何處理空白有不同的策略。 getline刪除換行符,但cin >>離開它。這意味着在使用cin >>來讀取某些內容後,將會有一個換行符在輸入流中等待下一個getline「使用」。這意味着它會在字符串中讀入一個空行。

+1

這僅僅是在使用格式化輸入後直接使用'std :: getline()'。在這種情況下,它與格式化/無格式輸入無關。 – 0x499602D2 2014-10-08 02:32:52

+0

最終他會在一個循環中調用它,否則他不會打擾使用'CurrentNumberOfContacts'變量,他忘記包含聲明。 – Wug 2014-10-08 02:33:35

+0

@Wug當然可能會進入一個循環...有一天,這意味着這個答案,不準確,因爲它是關於'std :: cin'在使用'std :: getline'時如何與其他文本模式流發生分歧? (事實並非如此),將*可能*作爲回答*下一個*問題的一個體面的起點;不是這個。 – WhozCraig 2014-10-08 02:36:00

1

2件事。首先,你真的不需要在這種情況下cin.ignore()爲您使用

getline(). 

cin >> variable 

其次,我不知道爲什麼你的程序不能運行,但我建議使用一個

getline() 

調用,看看是否有效。但我沒有看到你的代碼無法正常工作的原因。

1

答案由@Galic提供是相當不錯的,但如果你想讀取一行字符而不會丟棄前導空格,則需要另一個解決方案。

你可以這樣做:

char a='\n'; 
while (a=='\n') 
{ 
    cin.get(a); 
} 
cin.unget(); 

做你的第一個函數getline前。這假定沒有由前一個cin產生的尾部空間,並且你的第一個輸入行不是空的。