只允许输入四位整数

6
我正在处理一个问题,它要求输入一个由四个数字组成的帐号。这必须使用基本的初学者C++完成。
我需要想出一种限制整数输入为四位数的方法。用户应该能够输入0043、9023或0001,并且这应该是可接受的值...
我认为我知道如何使用字符串来完成它... getline(cin,input),然后检查input.length() == 4?
但是我甚至不知道如何使用整数输入来做到这一点。

输入字符串并转换为整数。 - Karthik T
1
检查是否a>=1000 && a<=9999 - Karthik T
1
你是将输入读取为 int 还是作为带数字字符的 std::string - Code-Apprentice
4
@a>=1000 && a<=9999 这个条件不可行,因为如果用户输入0001,它会认为它超出了范围。请您改写该条件。 - B.K.
1
如果问题要求您将其作为“int”读入,则无法知道用户输入的是“43”,“043”还是“0043”,因为前导0会被删除。显然,前两个是无效的输入。 - Marlon
显示剩余3条评论
6个回答

2
请注意,如果004343不同,则输入实际上不是数字,而是类似于电话“号码”的数字字符串。
将该行读取为字符串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”值为止。 - emartel

1

这样的代码应该可以工作。一旦用户输入了四个字符,您可以对其进行验证。其余逻辑取决于您。

#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 << ' ';
}

你可以在这里看到它运行。

是的,就字符串而言,这基本上就是我所拥有的了...我想我只能使用字符串了。哦,好吧,希望他能接受。我的意思是...我们还没有讨论过任何其他方法。我可以使用while循环来不断读取字符,直到我有四个字符,但我不确定那是否可行。 - B.K.
1
@user2006048,你看过我的编辑了吗?它向你展示了一种将其存储为整数形式的方法,通过将其保存在int数组中。这样0000就是有效的。 - Rapptz
是的,不幸的是我还不能使用数组。谢谢你的建议。我想我会选择老式的字符串和length()函数。 - B.K.

1
我喜欢你使用string作为输入的想法。这是有道理的,因为账户“号码”只是一个标识符。你不会在计算中使用它。通过if (sizeof(input)==4),我认为你想检查string的长度。正确的方法是if (input.length() == 4)。这将检查用户输入了4个字符。现在你需要确保每个字符也是数字。你可以轻松地利用数字字符的ASCII代码按预期顺序排序这一事实来做到这一点。因此,if (input[i] >= '0' && input[i] <= '9')将使用适当的循环索引i完成任务。此外,你可能需要某种循环,它会继续要求输入,直到用户输入被认为是正确的为止。
作为检查每个字符是否为数字的替代方案,您可以尝试使用 int value = atoi(input.c_str()); 将字符串转换为 int。然后,您可以轻松检查 int 是否为四位或更少位数。

@Marlon 哈哈,我完全没注意到。谢谢你解释这个踩票。 - Code-Apprentice
@Marlon 我解决了。所以,撤销操作将不胜感激;-) - Code-Apprentice
问题在于仅检查长度仍允许像“abcd”这样的账户号码。是否允许字母和其他字符,还是只允许数字? - Code-Apprentice
只是数字而已。但是我认为他在这个阶段对输入验证会非常宽容,因为我们甚至还没有涉及数组,刚刚开始使用函数。 - B.K.
是的,他也希望它能够存储像 0004 这样的有效账户号码。 - B.K.
显示剩余8条评论

0
// 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;
}

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

这对于任何使用数字的内容都适用,例如1234...但是,如果账号是0001,它将显示数字位数为1。我认为为了简单起见,我会选择字符串,并祈祷他接受它,我只是不知道在C++的基本形式中有什么可以做到这一点。 - B.K.
你需要检查一个字符数组(字符串)是否为四位全数字的字符串? - Mark

0
你可能希望你的代码能够对用户输入做出响应,所以我建议一次获取一个字符,而不是读取整个字符串:
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。1. 我无法在NetBeans中使其工作(之前尝试过)... 2. 我们没有这个头文件,所以我不想为此任务搞砸它... 谢谢。 - B.K.
很遗憾,因为使用std::cin缓冲输入的方式对于这种情况来说真的很烦人,除非输入新行,否则无法得到任何反馈。 - emartel

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

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

    return 0;
}

所以,循环会一直进行,直到收集到4个字符。理论上应该是这样的。但它不起作用。它会在2位数字、5位数字等处停止...我认为这可能是cin.get()获取空格的本质,但不确定。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接