我正在做一个问题,它要求输入一个仅由四位数字组成的帐号。这必须通过基本的初学者 C++ 来完成。
我需要想办法将整数的输入限制为四位数。用户应该能够输入 0043 或 9023 或 0001 并且它应该是可接受的值....
我想我知道如何用字符串完成它.... getline(cin,input) 然后检查 input.length()==4?
但我不知道如何使用整数输入来做到这一点。
请注意,如果0043
旨在与 不同43
,则输入实际上不是数字,而是数字字符串,就像电话“号码”一样。
将该行作为字符串读取input
。
检查 的长度是否input
为4
。
检查字符串中的每个字符是否为<= '9'
and >= '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;
}
我喜欢您使用 astring
作为输入的想法。这是有道理的,因为帐户“号码”只是一个标识符。您不会在计算中使用它。我认为您正在尝试if (sizeof(input)==4)
检查. string
正确的方法是if (input.length() == 4)
. 这将检查用户是否输入了 4 个字符。现在您需要确保每个字符也是一个数字。您可以利用数字字符的 ASCII 代码按您期望的顺序排列这一事实轻松做到这一点。因此if (input[i] >= '0' && input[i] <= '9')
,将为 index 使用适当的 for 循环来解决问题i
。此外,您可能需要某种循环来继续要求输入,直到用户输入被认为正确的内容。
编辑:
作为检查每个字符是否为数字的替代方法,您可以尝试将字符串转换为int
with int value = atoi(input.c_str());
。然后您可以轻松检查 是否int
是四位或更少的数字。
像这样的东西应该工作。一旦用户输入了正好四个字符的内容,您就可以对其进行验证。其余的逻辑由你决定。
#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";
}
}
如果您想以整数形式存储它,将整数保存在 an 中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 << ' ';
}
你可以看到它在这里运行
// 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 位。
您可能希望您的代码能够响应用户输入,因此我建议一次获取每个字符而不是读取字符串:
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
。
所以我正在研究如何使用整数类型来获取输入,并查看了 char ......因为它在技术上是最小的整数类型,它可以用来获取代码......我能够想出这个,但它肯定还没有完善(我不确定是否可以):
int main() {
int count=0;
while(!(count==4)){
char digit;
cin.get(digit);
count++;
}
return 0;
}
因此,循环继续进行,直到收集到 4 个字符。嗯,理论上应该。但它不起作用。它会停在 2 位数、5 位数等......我认为这可能是 cin.get() 抓取空白的性质,不确定。