使用多个分隔符定界

时间:2016-12-08 01:22:42

标签: 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;
}

但是,这只会标记第一个单词,之后没有任何内容,例如viz:

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

我做错了什么以及在不使用第三方库的情况下做到这一点的正确方法是什么? 问候。

1 个答案:

答案 0 :(得分:3)

遗憾的是,这是一个相当常见的陷阱。许多关于C ++的入门课程和书籍教会您接受这样的交互式输入:

cin >> input;

许多介绍性的简单练习通常会提示单个某种值,并且对于该用例,它可以正常工作。

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

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

getline(cin, input);