在 C++ 中使用 getline()

Using getline() in C++

本文关键字:getline C++      更新时间:2023-10-16

我在使用 getline 方法获取用户键入的消息时遇到问题,我正在使用以下内容:

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

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

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

它会是这样的:

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

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

如果你的

输入中只有一个换行符,只需做

std::cin.ignore();

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

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

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

例如,请参阅ignore函数的参考。

为了更安全,请在循环中执行上述第二个替代项,直到gcount返回零。

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

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();
    }
}
我知道

我迟到了,但我希望这很有用。逻辑是当用户想要输入多行时一次取一行

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

政府拼贴 伯汉波尔

塞兰波尔纺织品拼贴画

伯汉波尔塞兰波尔

输出

政府拼贴 伯汉波尔

塞兰波尔纺织品拼贴画

伯汉波尔塞兰波尔

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

做:

getchar();

在计划结束之前

代码是正确的。问题一定出在别的地方。尝试 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;
}