String getline(cin,variable)函数正在跳过一些代码行

时间:2014-10-08 02:23:51

标签: c++

当我使用getline(cin,variablehere)函数时,我的程序会跳过一些代码。我不知道代码有什么问题。见下面的输出

#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;
}

我已经输入了&#39; int&#39;作为数据类型,因为它只包含数字

enter image description here

4 个答案:

答案 0 :(得分:3)

我建议删除所有 cin.ignore()命令。

用户输入的一个问题是>>运算符不会将RETURN字符从流中取出,因此如果您使用getline()跟随它,getline()将会读取返回字符而不是您要输入的内容。

所以我会将所有你的getline()更改为:

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

同时删除cin.ignore()命令的全部。在getline()命令之后使用它们时没有做任何有用的事情,并且如果我更改了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);

答案 1 :(得分:1)

cin >>getline合作得不好。他们对如何处理空白有不同的策略。 getline删除了换行符,但cin >>将其删除。这意味着在您使用cin >>读取内容后,将在输入流中等待下一个getline到&#34;使用&#34;。这意味着它会在字符串中读取一个空行。

答案 2 :(得分:1)

2件事。首先,在这种情况下,你不需要cin.ignore()作为你的使用

getline(). 

之前

cin >> variable

其次,我不知道为什么你的程序没有运行,但我建议使用

getline() 

打电话,看看是否有效。但我认为你的代码无法正常工作。

答案 3 :(得分:1)

@Galic提供的答案相当不错但是如果你想在不丢弃前导空格的情况下阅读一行字符,你需要另外一个解决方案。

你可以这样做:

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

在做第一个getline之前。假设没有前一个cin导致的尾随空格,并且您的第一个输入行不为空。