如何在不使用 getline() 的情况下接受不同行中的整数输入值?
Posted
技术标签:
【中文标题】如何在不使用 getline() 的情况下接受不同行中的整数输入值?【英文标题】:How to accept integer input values in different lines without using getline()? 【发布时间】:2020-08-24 19:33:47 【问题描述】:例如,我需要接受不同线上的两个矩形的尺寸。
我是这样尝试的:
int a1, b1, a2, b2;
char c;
cin >> a1 >> b1;
cin >> c >> a2 >> b2;
【问题讨论】:
如果不使用 getline (或类似的东西),您将无法做到这一点。你能解释一下为什么不能使用 getline 吗? 如果将其作为字符串接受,则无法对整数值执行任何操作。值将接受空格和不同矩形的不同行。 执行此操作的方法是将行作为字符串读取,然后将字符串转换为整数。有很多不同的方法可以将字符串转换为整数。 但是最简单的方法是写cin >> a1 >> b1 >> a2 >> b2;
如果输入在两行上,这将起作用,但如果输入在一行,三行或如何很多行。这真的有问题吗?
operator>>
将换行符视为可忽略的空格,这就是为什么 cin >> c
无法跳过换行符。
【参考方案1】:
所以您希望用户以这种方式输入这 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)
这样的函数来检查给定字符串是否为整数。您可以根据自己的需要制作一个。 *** 已经有一个线程:How to determine if a string is a number with C++? 只有当字符串可以放入 int
时,该函数才必须返回 true。
然后您可以检查用户输入的隐藏宝石、非输入或垃圾邮件:
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;
不要给用户带来困难:
【讨论】:
以上是关于如何在不使用 getline() 的情况下接受不同行中的整数输入值?的主要内容,如果未能解决你的问题,请参考以下文章
为啥我可以在不使用 std::getline 的情况下调用 getline?
如何允许表单在不处理 Windows 消息的情况下接受文件删除?