使用getline忽略用户输入中的制表符和换行符

时间:2018-01-29 01:34:52

标签: c++ getline istream removing-whitespace

我正在编写一个程序,使用getline接受用户输入(我必须使用getline)并将其吐回屏幕。它也应该再次询问输入是否为空白。我在处理具有多个换行符和标签的输入时遇到了问题。

我已经接受了它的工作,但它已经循环了几次,我无法弄清楚如何解决它/做得更好。这是代码:

string name;

while(true) 
{
    cout << "What is your name?" << endl;

    getline(cin, name, '\n');
    if (!name.empty()) 
    {
        break;
    }
}
cout << "Hello " << name << "!" << endl;

return 0; 

这是输入:

\n
\n
John\n
Doe\n

我想要的输出应该是这样的:

What is your name?
Hello John Doe!

我的输出如下:

What is your name?
What is your name?
What is your name?
Hello John!

1 个答案:

答案 0 :(得分:1)

我可能无法理解您的要求,但如果您只想在不同的行中收集用户的名字和姓氏(同时忽略任何标签),您可以这样做。

#include <iostream>
#include <string>
#include <algorithm>

int main()
{
    std::string first;
    std::string last;
    std::cout << "What is your name?\n";
    while (first.empty())
    {
        std::getline(std::cin, first);
        // remove all tabs from input
        first.erase(std::remove(first.begin(), first.end(), '\t'), first.end());
    }
    while (last.empty())
    {
        std::getline(std::cin, last);
        // remove all tabs from input
        last.erase(std::remove(last.begin(), last.end(), '\t'), last.end());
    }
    std::string name = first + " " + last;
    std::cout << "Hello, " << name << "!\n";
    return 0;
}

您的用户将被允许点击返回/输入和标签,直到他们神志不清。在std::getline()获得一些非标签输入之前,无论发生多少新行或标签都无关紧要。根据你的问题,这似乎是你想要的。您可以使用std::remove here找到有关我用于删除标签的STL算法的更多信息。