【问题标题】:C++ srand function loopingC++ srand 函数循环
【发布时间】:2012-11-27 13:57:37
【问题描述】:

我有以下方法作为密码生成程序的一部分来生成一个随机密码,然后验证该密码。

我的问题是 srand 函数永远无法满足验证要求并不断循环返回以创建新密码。

我发布下面的代码是为了询问是否有人有更有效的方法来创建随机密码,以便满足验证要求,而不是不断地循环返回。谢谢。

static bool verifyThat(bool condition, const char* error) {
    if(!condition) printf("%s", error);
    return !condition;
}




//method to generate a random password for user following password guidelines.  
void generatePass()

{
    FILE *fptr;//file pointer
    int iChar,iUpper,iLower,iSymbol,iNumber,iTotal;


    printf("\n\n\t\tGenerate Password selected ");

    get_user_password:
    printf("\n\n\t\tPassword creation in progress... ");

    int i,iResult,iCount;
    char password[10 + 1];
    char strLower[59+1] = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRTUVWXYZ!£$%^&*";


    srand(time (0));

    for(i = 0; i < 10;i++)
    {
        password[i] = strLower[(rand() % 52)];

    }
    password[i] = '\0';


    iChar = countLetters(password,&iUpper,&iLower,&iSymbol,&iNumber,&iTotal);

    //folowing statements used to validate password
    iChar = countLetters(password,&iUpper,&iLower,&iSymbol,&iNumber,&iTotal);
    iUpper = countLetters(password,&iUpper,&iLower,&iSymbol,&iNumber,&iTotal);
    iLower =countLetters(password,&iUpper,&iLower,&iSymbol,&iNumber,&iTotal);
    iSymbol =countLetters(password,&iUpper,&iLower,&iSymbol,&iNumber,&iTotal);
    iNumber = countLetters(password,&iUpper,&iLower,&iSymbol,&iNumber,&iTotal);
    iTotal = countLetters(password,&iUpper,&iLower,&iSymbol,&iNumber,&iTotal);



    if(verifyThat(iUpper >= 2, "Not enough uppercase letters!!!\n")
     || verifyThat(iLower >= 2, "Not enough lowercase letters!!!\n")
     || verifyThat(iSymbol >= 1, "Not enough symbols!!!\n")
     || verifyThat(iNumber >= 2, "Not enough numbers!!!\n")
     || verifyThat(iTotal >= 9, "Not enough characters!!!\n")
     || verifyThat(iTotal <= 15, "Too many characters!!!\n"))

    goto get_user_password;

    iResult = checkWordInFile("dictionary.txt", password);

    if(verifyThat(iResult != gC_FOUND, "Password contains small common 3 letter word/s."))
    goto get_user_password;

    iResult = checkWordInFile("passHistory.txt",password);

    if(verifyThat(iResult != gC_FOUND, "Password contains previously used password."))
    goto get_user_password;


    printf("\n\n\n Your new password is verified ");
    printf(password);

    //writing password to passHistroy file.


    fptr = fopen("passHistory.txt", "w");   // create or open the file
    for( iCount = 0; iCount < 8; iCount++)
    {
        fprintf(fptr, "%s\n", password[iCount]);
    }

    fclose(fptr);


    printf("\n\n\n");
    system("pause");



}//end of generatePass method.

【问题讨论】:

  • 只是一个想法:使用字符的 ascii 值而不是巨大的数组...例如 static_cast&lt;char&gt;(rand() % 26 + 'A') 会给你一个大写字母。
  • 嗨,是的,我通过使用 ASCII 表计数的单独方法调用此验证。
  • 嘿 Anthony Sottile,我将如何在我的代码中实现这一点?这是否意味着丢弃数组并使用此代码 sn-p,如果可以,您能否展示如何将其合并到代码中,谢谢.

标签: visual-studio-2010 visual-c++ loops srand


【解决方案1】:

我一目了然地查看了您的代码,我想我已经找到了原因,尽管没有满足验证要求。

我建议您注意代码的以下部分:
1)char strLower[59+1] = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRTUVWXYZ!£$%^&amp;*";

这里你应该添加数字0..9,这是无法满足要求的原因之一,因为如果数字不在集合中,如何选择您从中选择的数字?!
替换它为前。与:

char strLower[] = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRTUVWXYZ!£$%^&*0123456789";

2) password[i] = strLower[(rand() % 52)]; - 在这部分代码中,替换 52 字符串中的符号总数,您可以从中随机选择数字。 我建议您将其替换为以下代码:

password[i] = strLower[(rand() % (sizeof(strLower) / sizeof(char) - 1))];

【讨论】:

    【解决方案2】:

    你可以改变你的算法。

    • 随机选择多个大于 2 的 Upper 字符。
    • 随机选择2个以上的Lower字符数。
    • 随机选择多个大于 1 的 Sybmol 字符。
    • 随机选择多个大于 2 的数字字符。

    然后用随机项目重新组合您的密码,随机重新排序。填写您希望通过 verifyThat 谓词的任何字符:>=9 和

    请:不要使用 goto。改为调用函数。

    【讨论】:

    • 我也在这个程序中使用了一种方法来计算密码中 ASCII 字符的数量以进行验证。我只是不确定你在这个答案中的意思。你的意思是从上、下、符号,字符并连接它们。你能展示这个在代码中实现的概念吗?干杯布赖恩。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多