C++ I';我比较了两个值相同的变量,但上面说它们';我们不一样

C++ I';我比较了两个值相同的变量,但上面说它们';我们不一样,c++,binaryfiles,C++,Binaryfiles,嗯,我被要求和SHA-256做一点工作。我必须从用户(在控制台中)接收用户名和密码,将密码更改为SHA-256哈希值并关闭文件(二进制文件)。然后我必须再次阅读,获取数据并将其与新用户输入进行比较,检查它们是否相同。使用SHA-256哈希的简单登录系统。问题是,我写了一个随机的用户名和密码,但当我稍后在第二步尝试比较它们时,它失败了。SHA-256部分直接来自原始代码,这不是本次分配的重点 我试着把我所有的字符数组改成字符串、used、strcpy、strcpy_和strncpy(以防万一)等等

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

我试着把我所有的字符数组改成字符串、used、strcpy、strcpy_和strncpy(以防万一)等等,但似乎不起作用。大多数编解码器直接来自SHA-256(我的老师发的),但我还是把它放在这里

我将整个代码放在pastebin中(有点长):

我不知道如何在此文本框中正确编辑,因此请使用“粘贴箱”链接

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;
struct凭证{
字符用户[10];
字符密码[256];};
int main(){
全权证书c;
char user2[10];
字符密码2[256];
串试验;
流文件;
int-opc;
做{
如果(c.user==user2)

由于
user2
是一个字符数组,而
Credentials::user
也是一个字符数组,所以这一行不是比较两个字符数组的方式。这一行的作用是比较两个指针,而不是数组的内容

要使用的函数是,或者如果要专门比较
N
字符,则函数是
strncmp

#include <cstring>
//...
if ( strcmp(c.user, user2) == 0)
{
   // strings are equal
}
#包括
//...
if(strcmp(c.user,user2)==0)
{
//字符串是相等的
}
现在,如果
c.user
和/或
user2
std::string
,那么使用
==
进行比较就可以了。这就是为什么在这方面使用
std::string
比使用字符数组直观得多的原因,例如
=
这样的操作实际上可以按预期工作。

if(c.user==user2)

由于
user2
是一个字符数组,而
Credentials::user
也是一个字符数组,所以这一行不是比较两个字符数组的方式。这一行的作用是比较两个指针,而不是数组的内容

要使用的函数是,或者如果要专门比较
N
字符,则函数是
strncmp

#include <cstring>
//...
if ( strcmp(c.user, user2) == 0)
{
   // strings are equal
}
#包括
//...
if(strcmp(c.user,user2)==0)
{
//字符串是相等的
}

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

如果(c.user==user2
这不是比较字符数组或一般数组的方式。至少,请发布
凭证
类声明,以便向其他人展示您在这里犯的错误,从而可以给出一个现在和将来都有意义的答案(因为您发布的链接可能随时消失)。对不起,花了我这么长时间,我是新来的
if(c.user==user2
这不是比较字符数组或一般数组的方式。至少,请发布
凭据
类声明,以便向其他人展示您在这里犯的错误,从而可以给出一个现在和将来都有意义的答案(因为你发布的链接可以随时消失)。对不起,我花了这么长时间,我是新来的