例如,我需要在不同的行中接受两个矩形的尺寸。
我试过这样做。
int a1, b1, a2, b2;
char c;
cin >> a1 >> b1;
cin >> c >> a2 >> b2;
所以你要让用户输入这4个 整数 以这种方式。
-10 0
30 40
你要拒绝所有其他格式的输入... ...
换句话说,输入必须包括。
4 int
整数
2 ' '
空间
2 '\n'
新线
你可以根据需要修改我将要讨论的逻辑来调整这些参数。.
这更像是一个解决问题的任务。总之,既然你不想使用 getline
由于某些原因,你将不得不自己管理大部分的输入处理。
这是我的看法。
读取输入字符(char ch
),直到你收到 四个独立 (用空格或换行符隔开) 投入 可以是任何东西,包括void,验证可以在之后进行)。使用 std::stringstream
(stringstream input
)来读取整个输入;这将使我们在进行输入验证时更加容易。有两个变量(unsigned spaceCount = 0;
和 unsigned newlineCount = 0;
)来控制循环的终止。
while (newlineCount + spaceCount != 4)
{
ch = cin.get();
input << ch;
if (ch == ' ')
++spaceCount;
if (ch == '\n')
++newlineCount;
}
在继续之前,你需要一个类似于 bool isInt(string num)
来检查给定的字符串是否是一个 是否为整数. 你可以根据自己的需要自己做一个。Stackoverflow已经有一个关于这方面的帖子。如何用C++确定一个字符串是否是一个数字? 只有当字符串可以被放入到一个 int
.
然后你可以检查用户输入是否有隐藏的宝石,非输入或垃圾邮件。
bool inputFormatCorrect = true;
if (spaceCount == 2 && newlineCount == 2)
{
stringstream tmpInput;
string tmpStr;
tmpInput << input.str();
for (int i = 0; i < 4; ++i)
{
tmpInput >> tmpStr;
if (!isInt(tmpStr))
{
inputFormatCorrect = false;
break;
}
}
}
else
{
inputFormatCorrect = false;
}
一旦检查完成,你可以提取并显示你的整数 (int a1, b1, a2, b2;
):
if (inputFormatCorrect)
{
input >> a1 >> b1 >> a2 >> b2;
cout << "a1 = " << a1 << ", b1 = " << b1 << ", a2 = " << a2 << ", b2 = " << b2;
}
else
{
cout << "I don't like your style of inputting...";
}
把所有的东西放在一起 Live Demo
我不确定你是否也想限制空格 但你可以修改逻辑,删除所有出现的空格 spaceCount
并将读取循环条件改为 while (newlineCount != 2)
如果需要的话
所以,你真的是想把事情搞复杂吗?我们之所以有 标准 输入.
我还是喜欢
cin >> a1 >> b1 >> a2 >> b2;
而不是给用户刁难。