更改数组大小会更改STRCMP的行为

时间:2013-09-29 17:34:15

标签: c arrays

我的程序从文件HashedPassword.txt检查给定的4位散列,并将其与所有可能的4个大写字母可能性进行比较,这些可能性应该在temp.txt中。

我的问题是,如果我的数组" alpha"大小为13及以下,在这种情况下,我的程序将点击STRCMP if语句并给我正确的密码,该密码对应于HashedPasswords.txt中给出的散列,任何大小为13的数组都将导致STRCMP打印出无停止&# 34; 1"因此找不到匹配。'

我该如何解决这个问题?

P.S我尝试改变line和line2的大小,使它们更大也改变了strcmp的输出。

#include<stdio.h>
#include<stdlib.h>
#include<string.h>

void E(char *in, char *out);

int main()
{
    FILE* file,*fp2,*fp3;
    char input[5];
    char pass[5];
    char alpha[15]="ABCD";//EFGHIJKLMNOPQRSTUVWXYZ";

    char compare;
    char string[5];
    int i,j,k,l,m,a;

    size_t lsize=0;
    char line[5];
    char line2[5];
    char output[5];
    char newline[2]="\n";
    char test[5];
    char *r=NULL;

    fp2=fopen("HashedPassword.txt","r");

    fgets(line2,sizeof(line2),fp2);

    printf("%s\n",line2);

    fclose(fp2);
    file=fopen("temp.txt","w");
    for(i=0;i<4;i++)
    {

        for(j=0;j<4;j++)
        {
            for(k=0;k<4;k++)
            {
                for(l=0;l<4;l++)
                {
                    fprintf(file,"%c%c%c%c\n",alpha[i],alpha[j],alpha[k],alpha[l]);
                }
            }
        }
    }

    fclose(file);

    fp3=fopen("temp.txt","r");

    while(getline(&r,&lsize,fp3))
    {
        E(r,output);

        printf("%d\n",strcmp(output,line2));

        if(!strcmp(output,line2))
        {
            printf("This is your password: %s\n",r);
            break;
    }

    }

    fclose(fp3);
}


void E(char *in, char *out)
{
    out[0]=(in[0]&0x80)^(((in[0]>>1)&0x7F)^((in[0])&0x7F));
    out[1]=((in[1]&0x80)^((in[0]<<7)&0x80))^(((in[1]>>1)&0x7F)^((in[1])&0x7F));
    out[2]=((in[2]&0x80)^((in[1]<<7)&0x80))^(((in[2]>>1)&0x7F)^((in[2])&0x7F));
    out[3]=((in[3]&0x80)^((in[2]<<7)&0x80))^(((in[3]>>1)&0x7F)^((in[3])&0x7F));
}

1 个答案:

答案 0 :(得分:3)

首先:output的长度为5,但您只需在E()中设置前四个字符,这意味着output[4]包含随机垃圾(无论发生在该特定情况中)记忆的字节)。 strcmp比较两个以空字符结尾的字符串,因此您应确保ouput[4] = '\0'至少完成一次。使用strncmp并提供长度(例如strncmp(output, line2, sizeof(output))也可以稍微好一点,以确保在错误的空终止时它不会完全变通。

更改局部变量的大小会影响堆栈output上的确切位置,这将影响output[4]的内容会影响strcmp的结果