在C ++中使用getline()

时间:2013-09-13 12:40:28

标签: c++ string getline

我使用getline方法获取用户输入的消息时遇到问题,我使用的是:

string messageVar;
cout << "Type your message: ";
getline(cin, messageVar);

但是,它没有停止获取输出值,这有什么问题?

7 个答案:

答案 0 :(得分:83)

如果您在getline()之后使用cin >> something,则需要在两者之间从缓冲区中清除换行符。您可以使用cin.ignore()

来完成此操作

这将是这样的:

string messageVar;
cout << "Type your message: ";
cin.ignore(); 
getline(cin, messageVar);

这是因为>>运算符在输入缓冲区中留下了换行符\n。当您执行未格式化的输入(例如getline())时,这可能会成为问题,该输入读取输入直到找到换行符。发生这种情况后,它会立即停止阅读,因为您之前的操作中留下了\n

答案 1 :(得分:5)

如果输入中只有一个换行符,只需执行

std::cin.ignore();

会正常工作。它从输入中读取并丢弃下一个字符。

但是如果输入中还有其他内容,除了换行符(例如,你读了一个单词但是用户输了两个单词),那么你必须这样做

std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');

参见例如this reference of the ignore function

为了更加安全,请在循环中执行上面的第二个替换,直到gcount返回零。

答案 2 :(得分:2)

int main(){
.... example with file
     //input is a file
    if(input.is_open()){
        cin.ignore(1,'\n'); //it ignores everything after new line
        cin.getline(buffer,255); // save it in buffer
        input<<buffer; //save it in input(it's a file)
        input.close();
    }
}

答案 3 :(得分:2)

我有类似的问题。一个缺点是,使用cin.ignore(),你必须按下输入1再次与程序混淆。

答案 4 :(得分:0)

我知道我要迟到了,但是我希望这会有所帮助。 如果用户要输入多行,则逻辑一次只能一行一行

int main() 
{ 
int t;                    // no of lines user wants to enter
cin>>t;
string str;
cin.ignore();            // for clearing newline in cin
while(t--)
{
    getline(cin,str);    // accepting one line, getline is teminated when newline is found 
    cout<<str<<endl; 
}
return 0; 
} 

输入

3

政府拼贴Berhampore

Serampore纺织拼贴

Berhampore Serampore

输出

政府拼贴Berhampore

Serampore纺织拼贴

Berhampore Serampore

答案 5 :(得分:-1)

我认为你没有在程序结束之前暂停程序,所以在获得inpus之后你输出的输出没有在屏幕上看到了吗?

做的:

getchar();

在节目结束前

答案 6 :(得分:-1)

代码是正确的。问题必须在其他地方。尝试使用std :: getline文档中的简约示例。

main ()
{
    std::string name;

    std::cout << "Please, enter your full name: ";
    std::getline (std::cin,name);
    std::cout << "Hello, " << name << "!\n";

    return 0;
}