代码忽略if语句 - C ++

时间:2016-11-05 18:06:08

标签: c++

我一直在为我的大学课程设计一个密码生成器,其中一个部分涉及创建“复杂”密码,这些密码只不过是随机字符串,用户应该能够指定使用的字符类型。但是,控制是否使用函数的if语句集不会根据uppertrue numbertrue和lowertrue中的值激活,它们都表现为该语句返回true,因此该函数始终运行。     #包括     #包括     #包括     #include

int upper(), lower(), number(), symbol();   //initializing functions to be    used to generate the ascii code
int clength = 15;
int pass[30];  
int uppertrue = 0, numbertrue = 1, symboltrue = 0;
int main()
{
    srand (time(NULL));                                                        //seed random generator
    int i = 0;                                                              //counter
    int which = 0;
    do
    {
        which = rand() % 4 + 1;     //randomly decides which type of character will be shown - probablity is unweighted for complex module
        if (which == 1)
        {
            pass[i] = lower();      //inserts the code returned  by the function into the array
            i++;
        }
        else if ((uppertrue == 1) && (which == 2))
        {
            pass[i] = upper();
            i++;
        }
        else if (numbertrue == 1 && which == 3)
        {
            pass[i] = number();
            i++;
        }
        else if (symboltrue == 1 && which == 4)
        {
            pass[i] = symbol();
            i++;
        }
    }while (i!=(clength+1));        //terminates loop when the array is complete
    std::string strpass;
    int x=0;
    do
    {
        char tempchar;
        tempchar = pass[x];
        std::cout << tempchar;
        x++;
    }while (x!=15);
    return 0;
}

int upper()     //creates random number between the range of ascii characters that results in caps
{
    return rand() % 65 + 26;

}

int number()    //same as upper but for numbers
{
    return rand() % 48 + 9;
}

int lower()     //same as upper but for lower case
{
    return rand() % 122 + 26;
}

int symbol()    //same as upper but for symbols (currently only supporting a few characters
{
    return rand() % 63 + 6;
}

如果有人能指出我正确的方向,我会非常感激,看起来这是一个逻辑错误,但我看不出任何逻辑错误。它可能与C ++的某种怪癖有关吗? (记住我被教过C,这是我用C ++做的第一件事) 非常感谢 (评论说要删除我通常输入uppertrue等值的部分,所以我已经硬编码了值来代替显示问题)

2 个答案:

答案 0 :(得分:2)

你的问题在这里:

int lower()     // same as upper but for lower case
{
    return rand() % 122 + 26;
}

它将产生26 ... 147范围内的随机数。这与小写字符的范围完全不同。你想要这个:

    return rand() % ('z' - 'a' + 1) + 'a';

您应该以类似的方式修复其他功能。

注意那些担心其代码能够运行的人,例如,使用EBCDIC字符编码的大型机:这假设a..z具有连续的字符代码。

答案 1 :(得分:1)

特定的问题是你在随机返回各种字符的函数中有错误。

C ++标准对于与字符关联的数值有意模糊。精确映射到实现,该方案称为编码

尽管ASCII编码很常见,但它并不是通用的,因此为了实现可移植性,除非你真的需要,否则最好不要对你的平台做出假设。

所以,你真的应该重新排列lower

char lower
{
    const char* s = "abcdefghijklmnopqrstuvwxyz";
    return s[rand() % 26];
}

这是真正的便携式。我也冒昧地改变你的函数返回类型。

你应该为upper做类似的事情。您的symbols功能也会同样退出。

我也很想对number采用相同的方法,但这里的C ++标准说出有关数字的内容: encoding 必须将字符0安排到9按顺序排列在一个连续的块中,所以声明

return rand() % ('9' - '0' + 1) + '0';

便携式的。作为最后的评论,你可以使用static char[] s = "abc...z";(sizeof(s) - 1)来代替硬编码的26.这是一种非常先进的技术,对于初学者来说并不明显,但是要研究它你的编程技巧得到发展。