【问题标题】:Ignore tabs and line breaks in user input using getline使用 getline 忽略用户输入中的制表符和换行符
【发布时间】:2018-07-07 16:13:33
【问题描述】:

我正在编写一个程序,它使用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!

【问题讨论】:

  • '\n' 无论如何都是std::getline() 的默认分隔符。
  • 至于你的问题:为什么不写另一个循环来收集输入?
  • 我不知道该怎么做,它将如何收集输入?
  • 并对其进行了编辑以匹配输出内容,谢谢!
  • 首先你需要指定一个条件,来决定何时完成名称。您的修改仍然不准确。

标签: c++ getline istream removing-whitespace


【解决方案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() 获得一些非选项卡输入之前,发生多少换行符或制表符并不重要。从您的问题来看,这似乎是您想要的。你可以找到更多关于我用来删除标签的 STL 算法的信息std::removehere

【讨论】:

    猜你喜欢
    • 2019-03-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-24
    相关资源
    最近更新 更多