C解密程序 - 检测到堆损坏

时间:2014-09-13 12:08:03

标签: c string encryption

我正在尝试编写一个非常简单的代码。

基本上,我从用户那里得到一个“加密”字符串,我的代码用以下规则对其进行解密:

“从字符串的第一个字母减去1,从第二个减去2,从第三个减去3,依此类推。空格保持不变”

我写了这段代码:

char* q4(char* str_in)
{
    char* str_out;
    int str_out_length,i,temp;
    str_out_length=strlen(str_in)+1; //+1 for null terminator
    str_out=(char*)malloc(sizeof(char)*str_out_length);
    str_out[str_out_length]='\0'; //null terminator at last index
    for(i=0;i<str_out_length;i++)
    {
        if(str_in[i]!=' ')
        {
            temp=str_in[i];
            str_out[i]=(char)(temp-i-1);
        }
        else
            str_out[i]=str_in[i];
    }
    return str_out;
}

我的代码似乎返回了错误的输出,不仅如此,我还有一个错误,上面写着“检测到堆腐败”。

例如,当输入的字符串为Btwlzx Dqqes时,输出为Arthur <hgZg<=并出现错误。基本上第一个词是正确的。第二个是垃圾。如果我只输入Btwlzx,则输出为Arthur-并表示错误。

我做错了什么?

1 个答案:

答案 0 :(得分:2)

str_out_length=strlen(str_in)+1; //+1 for null terminator
str_out=(char*)malloc(sizeof(char)*str_out_length);

似乎终结符位于分配的缓冲区后面一个字节。尝试

str_out[str_out_length - 1]='\0';

同样地,也许

for(i=0;i<str_out_length;i++)

应该是

for(i=0;i<str_out_length-1;i++)

或者,或许更好,改变

str_out_length=strlen(str_in)+1; //+1 for null terminator
str_out=(char*)malloc(sizeof(char)*str_out_length);

str_out_length=strlen(str_in);
str_out=(char*)malloc(sizeof(char)*(str_out_length+1)); //+1 for null terminator

然后使用str_out_length而不使用-1 - 更正。


更新(阅读评论后)

print_decrypted("Btwlzx Dqqes Eq|pj2 Tjhvqujs Iqoqjy bpg Eqfxtx Xcwwtt");

输出

  <?> Arthur Conan Doyle,Sherlock Holmes和Watson医生

void print_decrypted(char* str)
{
    int k = 0;
    for (int i = 0; str[i] != '\0'; i++)
    if (str[i] != ' ')
    {
        printf("%c", str[i] - k - 1);
        k++;
    }
    else
    {
        printf(" ");
        k = 0;
    }
    printf("\n");
}