c++ - 使用多个分隔符进行分隔

标签 c++ string

所以我有一个任意长的字符串,我将其作为用户的输入,我想对其进行标记并将其存储在 vector<std::string> 中。这是我正在使用的代码(可能受到我的 C 背景的启发):

#include <iostream>
#include <vector>
#include <string>
#include <iterator>
#include <sstream>
#include <string.h>
using namespace std;

int main()
{
    string input;
    cout << "Input a \' \' or \',\' or \'\\r\' separated string:  ";
    cin >> input;

    vector<string> tokens;

    char *str = new char[input.length() + 1];
    strcpy(str, input.c_str());
    char * pch;
    pch = strtok(str, " , \r");
    while (pch != NULL)
    {
        tokens.push_back(pch);
        pch = strtok(NULL, " , \r");
    }

    for (vector<string>::const_iterator i = tokens.begin(); i != tokens.end(); ++i)
        cout << *i << ' ';
    return 0;
}

但是,这仅标记第一个单词,之后不标记任何内容,例如:

Input a ' ' or ',' or '\r' string:  hello, world I am C.
hello

我做错了什么,不使用第三方库的正确方法是什么? 问候。

最佳答案

遗憾的是,这是一个非常常见的陷阱。许多关于 C++ 的入门类(class)和书籍教您接受这样的交互式输入:

cin >> input;

许多介绍性的简单练习通常会提示输入某种单一值,对于该用例来说,这效果很好。

不幸的是,这些书并没有完全解释 >> 的实际作用,而它的作用实际上是从输入中去除空格,并且只处理输入直到下一个空格。即使输入是一个字符串。

因此,当您输入整行文本时,只有第一个单词被读入input。解决方案是使用正确的工具,完成正确的工作:std::getline(),它读取一行文本,并将其放入单个字符串变量中:

getline(cin, input);

关于c++ - 使用多个分隔符进行分隔,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41030243/

相关文章:

c++ - 性能 : boost. 计算对比opencl C++ 包装器

c++ - std::optional:simple 和 ref-qualified value() 之间的有效区别

c++ - Qt中如何编写Sqlite数据库

java - 如何检查给定的字符串是否是一个单词

ruby - 转换已经用 UTF-8 编码的 ruby​​ 字符串中的 unicode 字符

c++ - 字符* 替换为字符*

c++ - C++中的TCP/IP网络通信

成员和mixin的c++可变参数模板构造函数初始化列表

长长度 StringTokenizer 的 Java 性能问题

c# - 搜索两个值之间的字符串列表