因此,在大多数输入行中,我必须先输入一个整数,然后输入空格,然后输入一个字符串,例如“ 3 kldj”或“ 5 sfA”,但要表示停止,我只需要输入整数0。使用cin >> intVar >> stringVar;它总是一直在寻找stringVar,并且不只接受0。当字符串为空时,如何只接受N?
if (!(cin>>N>>input)) {
break;
cin.clear();
}
我已经尝试过了,但是没有用。这是在while循环内,所以我用它来打破它。 N是整数,输入是字符串。
答案 0 :(得分:1)
您可能应该放弃在一个输入行中尝试此操作。分成两部分:
int N;
std::string input;
while (true) {
std::cin >> N;
if (N == 0) {
break;
}
std::cin >> input;
}
这应该很好。当用户为0
输入N
时,循环退出。
但是,如果必须执行一条输入行,则必须走困难的路。
使用regex
的含义。它允许您解析输入并始终保证一定的行为。
#include <regex>
#include <iostream>
#include <string>
#include <vector>
#include <utility> //std::pair
int main() {
const std::regex regex{ "^(?:([0-9]+) ([a-zA-Z]+))|0$" };
std::smatch smatch;
std::vector<std::pair<int, std::string>> content;
std::cout << "type in numbers + word (e.g. \"5 wasd\"). single \"0\" to exit.\n\n";
std::string input;
while (true) {
bool match = false;
while (!match) {
std::getline(std::cin, input);
match = std::regex_match(input, smatch, regex);
if (!match) {
std::cout << "> invalid input. try again\n";
}
}
if (input == "0") {
break;
}
auto number = std::stoi(smatch.str(1));
auto word = smatch.str(2);
content.push_back(std::make_pair(number, word));
}
std::cout << "\nyour input was:\n[";
for (unsigned i = 0u; i < content.size(); ++i) {
if (i) std::cout << ", ";
std::cout << '{' << content[i].first << ", " << content[i].second << '}';
}
std::cout << "]\n";
}
示例运行:
type in numbers + word (e.g. "5 wasd"). single "0" to exit.
5 asdf
12345 longer
hello
> invalid input. try again
5
> invalid input. try again
0
your input was:
[{5, asdf}, {12345, longer}]
^(?:([0-9]+) ([a-zA-Z]+))|0$
的解释:
1 "([0-9]+)"
-捕获任意(非零)位数
2 " "
-单个空格
3 "([a-zA-Z]+)"
-捕获任意(非零)个a-z或A-Z字符
整个事物的组织方式类似于(?: /*…*/)|0
,意思是或者由规则1-3 或组成的字符串,只有一个\“ 0 \”与输入匹配。 ^
和$
表示输入的开始和结束。 ?:
可以将规则1-3分组而不捕获它。
答案 1 :(得分:0)
除非在“非终止”行的开头也可以有零,否则将问题从“如果不带数字则只读取一个数字”改为“读取一个数字然后读取一个”字符串,但前提是数字不为0“。
while (cin >> N && N != 0)
{
if (cin >> input)
{
// Handle input
}
}