我正在为学校编写一个应该检查密码强度并将它们分成3个参数的程序。我有一个问题,即识别强者中的特殊字符以对强者进行分类。非常感谢任何帮助。
#include <iostream>
#include <string>
using namespace std;
int main()
{
string input;
bool complete = false;
bool hasUpper = false;
bool hasLower = false;
bool hasDigit = false;
bool specialChar = false;
int count;
char special = 'a';
do
{
cout << endl << "Enter a password to rate its strength. Enter q to quit." << endl;
cin >> input;
for(count =0; count < input.size(); count++)
{
if( islower(input[count]) )
hasLower = true;
if( isupper(input[count]) )
hasUpper = true;
if( isdigit(input[count]) )
hasDigit = true;
special = input.find_first_not_of("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890 ");
if (special != 'a')
specialChar = true;
}
if (hasLower && hasUpper && hasDigit && specialChar && (count >= 8))
{
cout << "Strong" << endl;
}
else if((hasLower || hasUpper) && hasDigit && (count >= 6))
{
cout << "Moderate" << endl;
}
else
{
cout << "Weak" << endl;
}
if (input == "q") complete = true;
}while (!complete);
return 0;
}
答案 0 :(得分:5)
size_t special;
if (special != string::npos)
specialChar = true;
find_first_not_of
返回找到的字符的索引,如果没有找到字符则返回特殊值string::npos
。
由于find_first_not_of
返回的索引不是字符,因此您必须将special
声明为size_t
而不是char
。
答案 1 :(得分:2)
这是对您的代码结构的评论,而不是直接评论
回答你的直接问题。 (如果你纠正了
然而,问题将消失。)目前,
你似乎在混合两种不同的解决方案,非常奇怪
办法。特别是,您正在呼叫input.find_first_not_of
每次通过循环,尽管它检查所有
的人物。您应该选择一种解决方案并使用它
对于所有条件。
如果要循环,请检查每个字符:
for ( int count = 0; count != input.size(); ++ count ) {
unsigned char ch = input[count]; // To avoid undefined behavior
if ( islower( ch ) {
hasLower = true;
} else if ( isupper( ch ) ) {
hasUpper = true;
} else if ( isdigit( ch ) ) {
hasDigit = true;
} else {
hasSpecial = true;
}
}
请注意,if/else if
的使用意味着您不需要
对特殊特殊的测试是任何不符合要求的
之前的测试。如果您想要测试,!isalnum( ch )
能达到目的就好了。
或者,您可以为每个使用标准函数:
hasLower = std::find_if(
input.begin(),
input.end(),
[]( unsigned char ch ) { return islower( ch ); } )
!= input.end();
hasUpper = std::find_if(
input.begin(),
input.end(),
[]( unsigned char ch ) { return isupper( ch ); } )
!= input.end();
hasDigit = std::find_if(
input.begin(),
input.end(),
[]( unsigned char ch ) { return isdigit( ch ); } )
!= input.end();
hasSpecial = std::find_if(
input.begin(),
input.end(),
[]( unsigned char ch ) { return !isalnum( ch ); } )
!= input.end();
上面的lambda函数仅在C ++ 11中可用。 如果您没有C ++ 11,则必须单独编写 每个的功能对象,这将使这个解决方案远 比上面的简单循环更重。当然,除非你是 做了很多文字处理,在这种情况下,功能 对象将放入您的工具包中,可以多次重复使用。 除非您准备好功能对象并在工具中 但是,这个套件似乎比简单的循环更复杂 与lambda。 (另一方面,它更具惯用性。但是 那么,很难想象任何有经验的C ++程序员 没有他的工具包中的功能对象。)