我正在比较两个具有相同值的变量,但表示它们不同

时间:2019-06-23 20:59:28

标签: c++ binaryfiles

好吧,我被要求用SHA-256做一点工作。我必须从用户那里收到用户名和密码(在控制台中),将密码更改为SHA-256哈希值,然后关闭文件(二进制文件)。然后,我必须再次读取它,获取它的数据并将其与新的用户输入进行比较,检查它们是否相同。使用SHA-256哈希的简单登录系统。问题是,我写了一个随机的用户名和密码,但是当我稍后在第二步中尝试比较它们时,它失败了。 SHA-256部分直接出自原始代码,这并不是分配的重点。

我尝试将所有char数组更改为字符串,使用过的strcpy,strcpy_s和strncpy(以防万一)等,但是似乎不起作用。大多数代码直接来自SHA-256(我的老师发送了),但是我还是把它放在这里

我将整个代码放在pastebin中(有点长):https://pastebin.com/W9jxsbK6

我不知道如何在此文本框中正确进行编辑,因此请使用粘贴容器链接。

struct Credentials {
char user[10];
char password[256];};

int main() {
Credentials c;
char user2[10];
char password2[256];
string test;
fstream file;

int opc;
do{
    cout << "Menu:" << endl;
    cout << "1.Create new user and password" << endl;
    cout << "2.Validate user and password" << endl;
    cin >> opc;
    switch(opc){
    case 1:
        cout << "Type the user name" << endl;
        cin >> user2;
        strcpy_s(c.user, sizeof user2, user2);
        cout << "Type the password" << endl;
        cin >> password2;
        test = SHA256::digestString(password2).toHex();
        strcpy_s(c.password, sizeof test, test.c_str());           

        file.open("credentials.dat",ios::out|ios::binary);
        if(!archivo){
            cout<<"Error...\n";
        return -1;
        }

        file.write((char*)&c,sizeof(c));
        file.close();

        break;

    case 2:
        cout << "Type user name" << endl;
        cin >> user2;
        cout << "Type password" << endl;
        cin >> password2;
        file.open("credentials.dat",ios::in|ios::binary);
        if(!file){
            cout<<"Error...\n";
        return -1;
        }

        if(file.read((char*)&c,sizeof(Credentials))){
            if(c.user == user2 && SHA256::digestString(password2).toHex() == c.password){
                cout << endl << endl << "User validated" << endl;
            }else{
                cout << endl << endl << "Error" << endl;
            }
        }
    }

} while (opc > 0 && opc < 3);
cin.ignore();
return 0;

}

1 个答案:

答案 0 :(得分:0)

if (c.user == user2)

由于user2是一个字符数组,并且Credentials::user也是一个字符数组,因此该行不是您比较两个字符数组的方式。该行要做的是比较两个指针,而不是数组的内容。

要使用的功能是strcmp,或者如果要专门比较N个字符,则功能是strncmp

#include <cstring>
//...
if ( strcmp(c.user, user2) == 0)
{
   // strings are equal
}

现在,如果c.user和/或user2std::string,那么使用==进行比较就可以了。这就是为什么在这方面使用std::string比使用char数组直观得多的原因-==之类的操作实际上可以按预期工作。