53

我在使用 getline 方法获取用户键入的消息时遇到问题,我正在使用类似的东西:

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

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

4

7 回答 7

105

如果您使用getline()after cin >> something,则需要将换行符从中间的缓冲区中清除。您可以使用cin.ignore().

它会是这样的:

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

发生这种情况是因为操作员在输入缓冲区中>>留下了换行符。\n当您进行无格式输入时,这可能会成为一个问题,例如getline(),它会读取输入直到找到换行符。发生这种情况时,它将立即停止读取,因为\n在您之前的操作中它一直挂在那里。

于 2013-09-13T12:48:00.237 回答
6

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

std::cin.ignore();

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

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

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

参见例如this reference of the ignorefunction

为了更安全,请在循环中执行上面的第二种选择,直到gcount返回零。

于 2013-09-13T12:53:30.773 回答
3

我有类似的问题。一个缺点是cin.ignore(),你必须再按回车键 1 次,这会使程序混乱。

于 2017-02-27T00:40:04.077 回答
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();
    }
}
于 2014-08-16T11:45:33.483 回答
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 塞兰波尔

输出

政府拼贴画 Berhampore

Serampore 纺织拼贴画

Berhampore 塞兰波尔

于 2020-07-30T07:52:56.380 回答
-1

我认为您没有在程序结束之前暂停程序,因此您在获得输入后放置的输出没有在屏幕上看到,对吗?

做:

getchar();

程序结束前

于 2013-09-13T12:47:51.113 回答
-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;
}
于 2013-09-13T12:47:52.453 回答