我有一个提示用户输入。我想取这个用户输入并将每个单词存储在一个向量中,按空格分隔,除非引号之间包含一组单词,在这种情况下,我希望引号中的所有单词都计为1。
例如,如果用户输入以下内容:
12345 Hello World "This is a group"
然后我想要存储矢量:
vector[0] = 12345
vector[1] = Hello
vector[3] = World
vector[4] = "This is a group"
我有以下代码,用空格分隔用户输入并将其存储在向量中,但我无法弄清楚如何使引号中的所有文本都计为一个。
string userInput
cout << "Enter a string: ";
getline(cin, userInput);
string buf;
stringstream ss(userInput);
vector<string> input;
while (ss >> buf){
input.push_back(buf);
我想在用户输入引号的字词周围保留引号。我还想将结果保存到矢量而不是仅仅将字符输出到屏幕
答案 0 :(得分:4)
C ++ 14内置了它:http://en.cppreference.com/w/cpp/io/manip/quoted
#include <string>
#include <vector>
#include <sstream>
#include <iostream>
#include <iomanip>
int main(void) {
std::istringstream iss("12345 Hello World \"This is a group\"");
std::vector<std::string> v;
std::string s;
while (iss >> std::quoted(s)) {
v.push_back(s);
}
for(auto& str: v)
std::cout << str << std::endl;
}
打印
12345
Hello
World
This is a group
答案 1 :(得分:2)
这是一个有效的例子:
#include <string>
#include <vector>
#include <iostream>
using namespace std;
int main(void) {
string str = "12345 Hello World \"This is a group\"";
vector<string> v;
size_t i = 0, j = 0, begin = 0;
while(i < str.size()) {
if(str[i] == ' ' || i == 0) {
if(i + 1 < str.size() && str[i + 1] == '\"') {
j = begin + 1;
while(j < str.size() && str[j++] != '\"');
v.push_back(std::string(str, begin, j - 1 - i));
begin = j - 1;
i = j - 1;
continue;
}
j = begin + 1;
while(j < str.size() && str[j++] != ' ');
v.push_back(std::string(str, begin, j - 1 - i - (i ? 1 : 0) ));
begin = j;
}
++i;
}
for(auto& str: v)
cout << str << endl;
return 0;
}
输出:
12345
Hello
World
"This is a group"
但请注意,此代码仅用于演示,因为它不能处理所有情况。例如,如果yuo在您的输入中有双引号,则此while(j < str.size() && str[j++] != '\"');
将表示从该点开始的整个字符串不会被分割。