嘿,我在微软VS上写了一些代码,用来比较输入的密码和存储在数据库中的密码,并返回批准或拒绝。。。
它在windows上运行得非常好,但是在转换到UNIX(使用eclipse)之后发生了一件有趣的事情-总是,第一次调用这个函数并没有在它应该返回的时候返回approved值,但是再次使用完全相同的参数调用这个函数会返回approved。。。如所愿。
调试之后,我确信问题出在“strcmp”中,它在第一次运行时返回false,在所有其他运行时返回true,参数完全相同。
有人知道问题出在哪里吗??
命令示例:
增加jt 111
//将密码添加到数据库
登录jt 111
否认
登录jt 111
经核准的
void login_helper(char *user, char *password){
int found = 0;
int i;
for (i=0 ; i<space ; i++){
if (strcasecmp(data[i].name,user) == 0) {
found = 1;
if (strcmp(data[i].hash ,Md5FromString(password)) == 0)
{
printf("approved.\n");
break;
}
else {
printf("denied.\n");
break;
}
}
}
if (found == 0) printf("denied.\n");
}
最佳答案
我预测对Md5FromString(password)
的调用返回一个指针,指向当Md5FromString()
函数返回时不再有效的缓冲区。这意味着你会遇到不确定的行为,在某些情况下会幸运,而在另一些情况下会倒霉。
将代码发布到Md5FromString()
。
关于c - C\UNIX\strcmp第一次使用是错误的,所有其他时间都更正,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5559437/