输入字符而不是int C ++

时间:2015-11-21 20:06:48

标签: c++

我正在编写一个代码,在输入整数数据类型或字符时记录。

    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;。

但是当我运行代码时会生成一个无限循环,并且不允许我再次重新输入。他们可以帮助我。引导我,你可能有一个坏主意。

1 个答案:

答案 0 :(得分:4)

当你尝试读取一个整数,并且你给出一个不是整数作为输入的东西时,会发生两件事情:第一件事是流得到它的failbit集,第二件事就是那样输入未提取。所以下一次迭代你再次读取相同的输入,并一次又一次......

我建议采用另一种策略:作为角色阅读,然后查看它是digitalphabetic字符还是完全不同的其他内容。 (可选)如果您需要实际的完整数字,请以字符串形式阅读,并尝试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.
    }
}

最后关于使用异常的说明:大多数人会认为它很糟糕。例外是例外,例外情况,不是程序正常流程的一部分。抛出异常是昂贵的并且会破坏正常流程。只能将它们用于特殊事情,例如错误。