我正在编写一个代码,在输入整数数据类型或字符时记录。
int numero,
countInteger = 0;
countCharacter = 0;
while ( 1 ) {
try {
cin >> numero;
cout << numero;
throw numero;
} catch (...) {
countCharacter++;
cout << "Error";
}
}
如果我输入了Integer,请计入&#34; countInteger&#34; (但不在代码中显示)。如果我输入一个字符,它就是一个例外并记录在&#34; countCharacter&#34;。
但是当我运行代码时会生成一个无限循环,并且不允许我再次重新输入。他们可以帮助我。引导我,你可能有一个坏主意。
答案 0 :(得分:4)
当你尝试读取一个整数,并且你给出一个不是整数作为输入的东西时,会发生两件事情:第一件事是流得到它的failbit
集,第二件事就是那样输入未提取。所以下一次迭代你再次读取相同的输入,并一次又一次......
我建议采用另一种策略:作为角色阅读,然后查看它是digit,alphabetic字符还是完全不同的其他内容。 (可选)如果您需要实际的完整数字,请以字符串形式阅读,并尝试convert to an integer。
澄清:缓冲使用std::cin
的输入。当您使用输入运算符>>
时,std::cin
将从缓冲区中提取字符。如果您尝试读取一个数字,但缓冲区中的第一个字符不是数字,则输入操作符将失败,并将该字符保留在缓冲区中。
简单(希望)示例:
让我们说你有这个代码
int number;
std::cin >> number;
std::cin >> number;
std::cin >> number;
作为该部分代码的输入,请输入
123abc
第一个输入将从输入中读取123
,并在字母处停止,将输入保留为
abc
现在我们来到第二个输入,代码将看到第一个字符不是数字,因此它将在流中设置failbit
并按原样保留输入:
abc
然后使用第三个输入,与第二个输入完全相同。
现在假设这是一个循环,输入操作符>>
将在迭代后迭代,看到非数字输入迅速返回,有效地给你一个无限循环。
现在澄清我的建议......根据程序的目标和要求,您可以读取字符并使用the character classification functions查看您的类型
像
这样的东西int countDigit = 0;
int countCharacter = 0;
char ch;
while (std::cin >> ch)
{
if (std::isdigit(ch))
++countDigit;
else if (std::isalpha(ch))
++countCharacter;
else
{
// Not a digit or an alphabetic character
// I.e. newlines, spaces, control characters, etc.
}
}
最后关于使用异常的说明:大多数人会认为它很糟糕。例外是例外,例外情况,不是程序正常流程的一部分。抛出异常是昂贵的并且会破坏正常流程。只能将它们用于特殊事情,例如错误。