所以我有一个任意长的字符串,我将其作为用户的输入,我想对其进行标记并将其存储在 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/