我正在使用C ++开发卡片游戏,我希望通过getline()获得一些用户输入。输入需要采用以下特定格式:
"1 2 3 4 5 6"
数字范围是1-11,每个数字必须用空格分隔。用户正在为矢量输入索引号。假设他写了“1 2 3”并命中输入,位置0,1和2正被矢量压缩。
考虑到设计决定让用户输入向量(或基本上是他们的卡片)的位置,我也对任何其他建议持开放态度。
播放器卡以“1蓝色”格式显示,并以字符串形式存储在矢量中。我认为用户输入整个卡片名称太麻烦了,所以我选择使用矢量索引。
下面是我的正则表达式字符串的代码片段。它有效,有点。它只是将整个字符串推入向量中,错过了10.但我不需要像这样的1个向量元素:“1 2 3 4”,我需要4个向量元素,每个数字都是一个元素。
不应该匹配的事情:
"1234567"
“ABCDEF”
"12 34 567 32"
如果您需要任何进一步的背景,我很乐意提供。
提前致谢
int main()
{
int i = 0;
std::regex rx("([[:digit:]]\\s)+([[:digit:]]\\s)+");
std::string line = "1 2 3 4 5 6 7 8 9 10";
std::smatch m;
std::vector<std::string> catchit;
while (regex_search(line, m, rx))
{
std::cout << "Pattern found " << m[i] << '\n';
catchit.push_back(m[i]);
line = m.suffix().str();
i++;
}
return 0;
}
这解决了我的问题,而不必使用正则表达式,非常感谢@Nick
为什么不std :: cin?或者将getline的输出包装在std :: stringstream中,并使用operator >>一次读取一个数字然后验证它们?例如。 std :: stringstream stream(line); / * loop * / stream >> val; if(val <0 || val> 11)...