我一直在寻找关于stackoverflow的答案,但是根本没有得到答案。一个很好的解释的答案将是惊人的。
这是我的不完整代码,用于密码验证程序。我要求用户输入,然后通过一系列布尔函数运行它,以确定它是否符合严格的密码标准。
如果您发现任何其他错误(我确定有),请告诉我。谢谢!
#include <iostream>
#include <ctype.h>
#include <cstring>
//DECLARING GLOBAL VARIABLES
bool isLong;
bool hasDigits;
bool hasAlphabets;
bool hasSpecial;
//FUNCTION TO CHECK IF PASSWORD IS LONG ENOUGH
bool checklen(std::string x)
{
if (x.length() > 8)
{
isLong = true;
}
else if (x.length() < 8)
{
isLong = false;
}
return isLong;
}
//FUNCTION TO CHECK IF PASSWORD HAS DIGITS
bool checkdigits(std::string x)
{
for (int i = 0; i < x.length(); i++)
{
if (isdigit(x[i]))
{
hasDigits = true;
}
else if (not isdigit(x[i]))
{
hasDigits = false;
}
}
return hasDigits;
}
//FUNCTION TO CHECK IF PASSWORD HAS ALPHABETS
bool checkalphabets(std::string x)
{
for (int i = 0; i < x.length(); i++)
{
if (isalpha(x[i]))
{
hasAlphabets = true;
}
else if (not isalpha(x[i]))
{
hasAlphabets = false;
}
}
return hasAlphabets;
}
//MAIN FUNCTION THAT RUNS THE VALIDATION AND HANDLES LOGIC
int main()
{
std::cout << "enter new password: ";
std::string password{};
std::cin >> password;
checklen(password); //trying pass the stored cin value as argument.
checkdigits(password); //trying to pass the stored cin value as argument.
checkalphabets(password); //trying to pass the stored cin value as argument.
//the functions literally use "password" as a string instead of the stored user input.
if (isLong = true)
{
if (hasDigits = true)
{
if (hasAlphabets = true)
{
std::cout << "Your password is strong";
}
}
}
else
{
std::cout << "Your password is still weak";
}
return 0;
}
答案 0 :(得分:2)
如何将std :: cin作为函数的参数传递?
std::cin
是std::istream
。因此,将其传递给函数的方式如下:
void function(std::istream& stream) {
// implmentation...
}
注意:我相信您不能按值传递std::istream
。您必须通过引用将其传递。
然后您这样称呼它:
function(std::cin);
请注意,您的程序中还有其他错误,请参见the other answer。但这通常就是将std::cin
传递给函数的方式。
答案 1 :(得分:2)
#include <iostream>
#include <algorithm>
bool isLong(std::string x)
{
return x.length() > 8;
}
bool hasDigits(std::string x)
{
return std::any_of(x.begin(), x.end(), ::isdigit);
}
bool hasAlpha(std::string x)
{
return std::any_of(x.begin(), x.end(), ::isalpha);
}
bool isStrong(std::string x)
{
return isLong(x) and hasDigits(x) and hasAlpha(x);
}
int main()
{
std::string password;
std::cout << "enter new password: ";
std::cin >> password;
if (isStrong(password))
std::cout << "Your password is strong";
else
std::cout << "Your password is weak";
return 0;
}
我假设
如果您发现任何其他错误(我确定有),请让我 知道。谢谢!
您想找到最“高效”的程序。
if
语句中的变量,不检查是否相等。checklen
函数将返回未初始化的boolean
密码的长度正好为8
。checkdigits
函数存在逻辑错误。的
返回值取决于最后检查的字符-而不是整个字符
串。如果最后一个字符是数字,它将返回true
,
否则它将返回false
,而不考虑整体
字符串。checkalphabets
中也存在与上述相同的逻辑错误
功能。std::string
的声明中不需要包括一个空的初始化程序列表。if
循环的嵌套不是必需的,因为您可以简单地使用&&
运算符。我上面发布的代码就是我认为的“最优”代码。它使用内置函数来减少代码复杂性,因此需要更多考虑。
如果您是编程的新手(我会假设),建议您尝试“空运行”代码,因为这将帮助您识别逻辑错误。
等号的语法错误应由良好的编译器处理。 (或者更确切地说,是逻辑错误,因为语法是“有效的”,但是99%的时间不是预期的。)
可以通过经验减少程序代码的效率(例如嵌套的if
循环)。