【问题标题】:Integer input restricted to four digits only整数输入仅限于四位数
【发布时间】:2013-01-08 23:31:49
【问题描述】:

我遇到了一个问题,它要求输入一个仅由四位数字组成的帐号。这必须用基本的初学者 C++ 来完成。

我需要想办法将整数的输入限制为四位数。用户应该能够输入 0043 或 9023 或 0001 并且它应该是一个可接受的值....

我想我知道如何用字符串完成它.... getline(cin,input) 然后检查是否 input.length()==4?

但我不知道如何使用整数输入来做到这一点。

【问题讨论】:

  • 输入字符串并转换为int。
  • 或检查 a>=1000 && a
  • 您将输入读取为int 还是带有数字字符的std::string
  • @Karthik T a>=1000 && a
  • @user2006048 如果问题表明您必须将其作为int 读入,则无法知道用户输入的是43043 还是0043,因为前导 0 被删除。显然前两个是无效输入。

标签: c++ input


【解决方案1】:

请注意,如果0043 旨在与43 区分开来,则输入不是实际上是一个数字,而是一个数字字符串,就像电话“号码”一样。

将该行读取为字符串input

检查input的长度是4

检查字符串中的每个字符是<= '9'>= '0'

类似:

std::string read4DigitStringFromConsole()
{
    bool ok = false;
    std::string result;
    while (!ok)
    {
        std::cin >> result;
        if (result.length() == 4)
        {
            bool allDigits = true;
            for(unsigned index = 0; index < 4; ++index)
            {
                allDigits = allDigits && ( 
                    (result[index] >= '0') && 
                    (result[index] <='9') 
                    );
            }
            ok = allDigits;
        }
    }
    return result;
}

【讨论】:

  • 虽然这可能“有效”,但无效的输入只会让用户陷入无限的“输入模式”,直到他弄清楚如何最终输入“ok”值
【解决方案2】:

我喜欢您使用string 作为输入的想法。这是有道理的,因为帐户“号码”只是一个标识符。您不会在计算中使用它。 if (sizeof(input)==4) 我认为您正在尝试检查 string 的长度。正确的方法是if (input.length() == 4)。这将检查用户是否输入了 4 个字符。现在您需要确保每个字符也是一个数字。您可以利用数字字符的 ASCII 代码按您期望的顺序排列这一事实轻松做到这一点。所以if (input[i] &gt;= '0' &amp;&amp; input[i] &lt;= '9') 将使用适合索引i 的for 循环来解决问题。此外,您可能需要某种循环来继续请求输入,直到用户输入被认为正确的内容。

编辑:

作为检查每个字符是否为数字的替代方法,您可以尝试使用int value = atoi(input.c_str()); 将字符串转换为int。然后您可以轻松检查int 是否为四位或更少位的数字。

【讨论】:

  • @Marlon 哈哈,我完全错过了。感谢您解释否决票。
  • @Marlon 我修好了。所以撤消将不胜感激;-)
  • 啊,是的,我也搞砸了.. string.length() 而不是 sizeof() 谢谢我会避开 input[i] 选项,因为那是一个数组,除非我'我错了,我们还没有讨论这些
  • @user2006048 您可以对字符串使用数组表示法。或者,您可以使用input.at(i)
【解决方案3】:

这样的事情应该可以工作。一旦用户输入了正好四个字符的内容,您就可以对其进行验证。其余的逻辑由您决定。

#include <iostream>
#include <string>

int main() {
    std::cout << "Enter a PIN Number: ";
    std::string pinStr;
    while(std::getline(std::cin,pinStr) && pinStr.size() != 4) {
        std::cout << "Please enter a valid value\n";
    }
}

如果您想以整数形式存储它,将整数保存在std::vector 中可能会有所帮助。你可以很容易地做到这一点(循环展开是为了清楚起见):

#include <iostream>
#include <string>
#include <vector>

int main() {
    std::cout << "Enter a PIN Number: ";
    std::string pinStr;
    while(std::getline(std::cin,pinStr) && pinStr.size() != 4 ) {
        std::cout << "Please enter a valid value\n";
    }
    std::vector<int> pin;
    pin[0] = pinStr[0] - '0';
    pin[1] = pinStr[1] - '0';
    pin[2] = pinStr[2] - '0';
    pin[3] = pinStr[3] - '0';

    //pin now holds the integer value.
    for(auto& i : pin)
        std::cout << i << ' ';
}

你可以看到它在运行here

【讨论】:

  • 是的,就字符串而言,这几乎就是我所拥有的......我猜我被字符串困住了。嗯,希望他能接受。我的意思是……我们还没有讨论过任何建议我可以以任何其他方式做到这一点的事情。我可以做一个 while 循环,继续读取字符,直到我有四个,但我不确定这是否可行。
  • @user2006048 你检查我的编辑了吗?它向您展示了一种以整数形式存储它的方法,方法是将它保存在一个整数数组中。这样0000 是有效的。
  • 是的,很遗憾我还不能使用数组。不过谢谢。我想我会选择好的 ol' 字符串和长度()。
【解决方案4】:
// generic solution
int numDigits(int number)
{
    int digits = 0;
    if (number < 0) digits = 1; // remove this line if '-' counts as a digit
    while (number) {
        number /= 10;
        digits++;
    }
    return digits;
}

类似于post。 然后你可以调用这个函数来检查输入是否是4位。

【讨论】:

  • 这适用于任何使用诸如 1234 之类的数字...但是,如果帐号是 0001,它将显示位数为 1。我想为简单起见,我会去用字符串,并祈祷他接受它,我只是不知道任何 C++ 的基本形式可以做到这一点。
  • 这意味着,您正在检查一个 char 数组(字符串)是否是一个四位全数字字符串?
【解决方案5】:

您可能希望您的代码能够响应用户输入,因此我建议一次获取每个字符而不是读取字符串:

std::string fourDigits;
char currentDigit;

std::cout << "Enter 4 digits\n";
for(int i = 0; i < 4; ++i)
{
    currentDigit = getch();
    if(isdigit(currentDigit))
    {
        fourDigits += currentDigit;
        std::cout << currentDigit; // getch won't display the input, if it was a PIN you could simply std::cout << "*";
    }
    else
    {
            // Here we reset the whole thing and let the user know he entered an invalid value
        i = 0;
        fourDigits = "";
        std::cout << "Please enter only numeric values, enter 4 digits\n";
    }
}

std::cout << "\nThe four digits: " << fourDigits.c_str();

这样您可以立即优雅地处理无效字符。使用字符串时,只有在用户点击Enter 时才会验证输入。

【讨论】:

  • 这是一个很棒的解决方案,但是,我必须包含 conio.h 和 1。我无法让它与 NetBeans 一起工作(之前尝试过)...... 2. 我们还没有这个标题,所以我不想为这个任务弄乱它......不过谢谢。
  • 这太糟糕了,因为输入被std::cin 缓冲的方式对于这种事情来说真的很烦人,直到输入新行才能得到反馈。
【解决方案6】:

所以我正在研究如何使用整数类型来获取输入,并查看了 char……因为它在技术上是最小的整数类型,它可以用来获取代码……我能够想出了这个,但它肯定还没有完善(我不确定是否可以):

int main() {
    int count=0;

    while(!(count==4)){
        char digit;
        cin.get(digit);
        count++;
    }

    return 0;
}

因此,循环继续进行,直到收集到 4 个字符。嗯,理论上应该。但它不起作用。它会停在 2 位数、5 位数等......我认为这可能是 cin.get() 抓取空白的性质,不确定。

【讨论】: