C++ I';我比较了两个值相同的变量,但上面说它们';我们不一样
嗯,我被要求和SHA-256做一点工作。我必须从用户(在控制台中)接收用户名和密码,将密码更改为SHA-256哈希值并关闭文件(二进制文件)。然后我必须再次阅读,获取数据并将其与新用户输入进行比较,检查它们是否相同。使用SHA-256哈希的简单登录系统。问题是,我写了一个随机的用户名和密码,但当我稍后在第二步尝试比较它们时,它失败了。SHA-256部分直接来自原始代码,这不是本次分配的重点 我试着把我所有的字符数组改成字符串、used、strcpy、strcpy_和strncpy(以防万一)等等,但似乎不起作用。大多数编解码器直接来自SHA-256(我的老师发的),但我还是把它放在这里 我将整个代码放在pastebin中(有点长): 我不知道如何在此文本框中正确编辑,因此请使用“粘贴箱”链接C++ I';我比较了两个值相同的变量,但上面说它们';我们不一样,c++,binaryfiles,C++,Binaryfiles,嗯,我被要求和SHA-256做一点工作。我必须从用户(在控制台中)接收用户名和密码,将密码更改为SHA-256哈希值并关闭文件(二进制文件)。然后我必须再次阅读,获取数据并将其与新用户输入进行比较,检查它们是否相同。使用SHA-256哈希的简单登录系统。问题是,我写了一个随机的用户名和密码,但当我稍后在第二步尝试比较它们时,它失败了。SHA-256部分直接来自原始代码,这不是本次分配的重点 我试着把我所有的字符数组改成字符串、used、strcpy、strcpy_和strncpy(以防万一)等等
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
这不是比较字符数组或一般数组的方式。至少,请发布凭据
类声明,以便向其他人展示您在这里犯的错误,从而可以给出一个现在和将来都有意义的答案(因为你发布的链接可以随时消失)。对不起,我花了这么长时间,我是新来的