嘿,我在微软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/

10-13 07:23