我想要一个带空格的字符串,因此我使用了getline()
但是之后我想得到另一个字符串(没有空格),如果有一个-e
,那么后面的字符串{ {1}},但是因为在我的代码中,我在使用s2
时失去了冲刺,我似乎无法实现我想要做的事情。任何建议都会非常有用。
getline()
}
答案 0 :(得分:1)
更好的选择是对getline()
进行一次调用,然后解析“command”字符串。从简单的split()
开启“ - ”或find('-')
答案 1 :(得分:1)
getline()
从is中提取字符并将其存储到str中,直到找到分隔字符delim或换行符'\n'
。
如果找到分隔符,它将被提取并丢弃(即不存储它,下一个输入操作将在它之后开始)。
答案 2 :(得分:0)
解析参数的方式当然可以改进,但这个答案与此无关。我认为你要找的是在var reg = new RegExp("[&?]list=([a-z0-9_]+)","i");
var url = 'https://www.youtube.com/playlist?list=PLcfQmtiAG0X-fmM85dPlql5wfYbmFumzQ';
var match = reg.exec(url);
return match[1];
删除它之后简单地将-
字符串放回流中。在这种情况下,您可以使用std::getline
方法
.putback()
答案 3 :(得分:0)
我将在这里做一些假设:
regex_search
可以很好地处理regex
:
(?:\s*-f\s+(\w+)|\s*-b\s+([^-]+)|\s*-e\s+(\w+))*
您需要先从cin
读取变量,例如string input
。这可以这样做:
getline(cin, input)
输入后,您可以执行以下操作:
if(smatch m; regex_search(input, m, regex{ "(?:\\s*-f\\s+(\\w+)|\\s*-b\\s+([^-]+)|\\s*-e\\s+(\\w+))*" })) {
if(m[1].length() > 0U) {
cout << "-f " << m[1] << endl;
}
if(m[2].length() > 0U) {
cout << "-b " << m[2] << endl;
}
if(m[3].length() > 0U) {
cout << "-e " << m[3] << endl;
}
}
答案 4 :(得分:0)
如果您在整行中阅读,并且您不想使用Boost程序选项或getopts,您可以自己解析该行(如建议的那样)。这将是一种方法,作为代码中动态解析的替代方法:
#include <iostream>
#include <string>
#include <tuple>
#include <vector>
using std::cout;
using std::endl;
using std::get;
using std::literals::string_literals::operator""s;
using std::make_tuple;
using std::string;
using std::tuple;
using std::vector;
static auto chunkLine(string const& line)
{
auto result = vector<string>{};
auto i = string::size_type{};
while (i != string::npos && i < line.size())
{
auto pos = line.find(" -", i);
auto count = pos == string::npos ? pos : (pos - i);
result.push_back(line.substr(i, count));
i = pos + (pos != string::npos ? 1 : 0);
}
return result;
}
static auto parseChunks(vector<string> const& chunks)
{
auto result = vector<tuple<string, string>>{};
for (auto const& chunk : chunks)
{
auto pos = chunk.find(" ");
if (pos != string::npos && chunk[0] == '-')
{
auto kv = make_tuple(chunk.substr(1, pos-1), chunk.substr(pos+1));
result.push_back(kv);
}
}
return result;
}
int main()
{
auto line = "-f name -b blah blah -e email"s;
auto keyValueTuples = parseChunks(chunkLine(line));
for (auto const& kv : keyValueTuples)
{
cout << get<1>(kv) << endl;
}
}
答案 5 :(得分:0)
我认为你应该在输入getline之前输入cin.ignore,如代码所示:
`string s,s1,s2;
char check_character;
while (cin.peek() != '\n')
{
if (cin.get() == '-')
{
check_character = cin.get();
switch(check_character)
{
case 'f':
cin >> s;
break;
case 'b':
if(cin.peek() != '\n')
cin.ignore
getline(cin, s1, '-');
else if(cin.peek() =='\n')
cin.ignore
getline(cin, s1);
break;
case 'e':
cin>> s2;
break;
}
}
}
cout << s << endl << s1 << endl << s2 << endl;
return 0; `