【问题标题】:How can i split text input to a list in C++? [duplicate]如何将文本输入拆分为 C++ 中的列表? [复制]
【发布时间】:2021-01-20 03:43:48
【问题描述】:

我可以将给定的文本拆分成一个列表,但是如果我想拆分用户给定的字符串,它就不起作用了。

void removeDupWord(string str)
{
    string word = "";
    for (auto x : str)
    {
        if (x == ' ')
        {
            cout << word << endl;
            word = "";
        }
        else
        {
            word = word + x;
        }
    }
    cout << word << endl;
}

int main()
{
    string ss;
    cin >> ss;
    ss = "split this";
    removeDupWord(ss);
}

【问题讨论】:

  • 如果你想分割用户给的字符串,你应该使用getline()。使用您的方法,您只能在字符串 ss 中获得第一个单词。
  • 我应该把getline()放在哪里?
  • 安装在cin &gt;&gt; s,使用std::getline(std::cin, ss);en.cppreference.com/w/cpp/string/basic_string/getline
  • 您正在对您的代码做出不成立的假设。您可以使用调试器或在从用户那里读取ss 后打印以查看实际问题在哪里
  • OT:出于效率原因,您应该将removeDupWord(string str) 更改为removeDupWord(const string &amp; str)

标签: c++ input text split


【解决方案1】:

使用std::getline 代替std::cin。使用std::cin,空格后面的输入将被丢弃。

int main()
{
    string ss;
    std::getline(std::cin, ss);
    //ss = "split this";
    removeDupWord(ss);
}

另外,你应该使用 C++ 标准算法来完成这种琐碎的任务

void removeDupWord(const std::string& str)
                 // ^^^^^^^^^^^^^^^^^ Noice this change
{
    std::stringstream ss(str);
   
    std::copy(std::istream_iterator<std::string>{ss}, 
              std::istream_iterator<std::string>{},
              std::ostream_iterator<std::string>(std::cout, "\n"));
}

Demo Here

【讨论】:

  • @P0W 为什么要将“std::istream_iterator<:string>{}”作为第二个参数写入std::copy?一个简单的“{}”就足够了。喜欢std::copy(std::istream_iterator&lt;std::string&gt;(ss), {}, std::ostream_iterator&lt;std::string&gt;(std::cout, "\n"));
猜你喜欢
  • 2021-05-09
  • 1970-01-01
  • 2018-01-27
  • 2012-12-08
  • 1970-01-01
  • 2018-12-30
  • 1970-01-01
  • 2020-10-01
  • 2018-08-25
相关资源
最近更新 更多