C \ UNIX \ strcmp首次使用是错误的,所有其他时间都是正确的

时间:2011-04-05 22:43:28

标签: c unix strcmp

嘿所有我在微软VS上写了一些代码,假设将输入的密码与存储在数据库中的密码进行比较并返回批准或拒绝... 它在windows上运行得非常好,但在转换为UNIX(使用eclipse)之后发生了一件有趣的事情 - 总是,第一次调用此函数时不会返回已批准的值,但是使用完全相同的params再次调用该函数根据需要批准...... 在调试之后,我很确定问题出在“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");
    }

2 个答案:

答案 0 :(得分:3)

我预测对Md5FromString(password)的调用会返回指向缓冲区的指针,该缓冲区在Md5FromString()函数返回时不再有效。这意味着你正在遇到未定义的行为,在某些情况下会变得幸运,而在其他情况下则不幸。

将代码发布到Md5FromString()

答案 1 :(得分:1)

我真的怀疑strcmp()中有任何问题。 : - )

(有一本关于软件开发的优秀书籍,名叫“实用程序员”,安德鲁·亨特和大卫·托马斯,其中有一个关于调试的提示称为“'选择'没有被破坏”,这最终意味着它真的不太可能基本系统功能(例如select()或strcmp())被破坏。)

您是否尝试在strcmp()之前打印'data [i] .hash'的内容和'Md5FromString(password)'返回的值?

类似的东西:

            char *md5;
            ...
            md5 = Md5FromString(password);
            printf("i: %d, hash: %s, md5: %s\n", i, data[i].hash, md5);
            if (strcmp(data[i].hash, md5) == 0)
                {
                ...

另外,谁为函数Md5FromString()分配内存?你能发送Md5FromString()的代码吗?

干杯, 圣保罗