静态C-字符串在函数中不保留其值(C++)。

问题描述 投票:0回答:1

在我的程序中,我试图让第一次运行加密密码,第二次运行相同的函数,确保两个密码相同(通过比较加密值)。

然而,当我这样做时,似乎 copyEncryp[8] 是不保留价值的 encryp[8]. 当运行程序时,我的编译器显示出了 cout 的声明 if 语句,两个C-字符串都匹配。

我是不是没有正确使用静态变量?按照我的理解,它们不像普通变量那样受范围限制,应该可以在第二次调用函数时保持相同的值。当我试图诊断这个问题时,我认为事实上静态C-String的声明连续被调用了两次(调用了 password_encryp 两次)是一个问题,所以我把声明移到了void function()中,但后来我得到了错误,说明静态C-字符串没有在该范围内定义(错误是在加密发生的第一行。有谁知道我在这里可能做错了什么,我想做的事情是否可能?

我需要调用加密函数两次,第一次加密第一个密码,第二次将加密密码的条目,加密,然后将其与第一个密码加密的副本进行比较。

void password_encryption(char password[8], int counter);

void function()
{
    static int counter = 0;
    static char password[8];
    cout << "Enter your password: ";
    cin >> password;
    password_encryption(password, counter); //passing password and counter value
    cout << "Enter the same password for confirmation: ";
    cin >> password;
    counter = 1; //counter for the number of times that the function has been called
    password_encryption(password, counter);//invoked a second time passing user entered password and counter
}

void password_encryption(char password[8], int counter)
{
    const int key = 15; 
    static char encryp[8];
    static char copyEncryp[8];
    //loop encrypts password
    for (int i = 0; (i < 8 && password[i] != '\0'); i++) //loop for password encryption
    {
        if (password[i]+key> 126)
            encryp[i] = 32+((password[i]+key)-127);
        else if (i < 32)
            encryp[i] = password[i] + key;
    }

    if (counter == 0) //only runs first time
        copyEncryp[8] = encryp[8]; //making the first encrypted password copyEncryp
    if (counter == 1) //only will execute second time
    {
        if(copyEncry[8] == encryp[8])
            cout << "Both passwords match" << endl;
        else 
            cout << "Both passwords do not match" << endl;
    }
}
c++ static c-strings
1个回答
3
投票

你没有正确使用数组。这是一个非法的数组访问

copyEncryp[8] = encryp[8];

因为你的数组大小是8,所以有效的索引是从0到7。

这似乎是一个很常见的新手误区,如果你把数组的大小放在方括号里,那么就意味着 "整个数组",但这是错误的。

© www.soinside.com 2019 - 2024. All rights reserved.