2014-09-13 77 views
1

我想写一个非常简单的代码。C解密程序 - 检测到堆损坏

基本上,我得到来自用户的“加密”的字符串,而我的代码解密它具有以下规则:

“从字符串的第一个字母减去一个,从第二减去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-并表示错误。

我在做什么错?

回答

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"); 

输出

柯南道尔,福尔摩斯和华生医生

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"); 
} 
+0

是的,我明白了,这是问题所在。感谢它现在的工作。无论如何,我被要求解密的文本看起来好像是胡言乱语。第一个词是亚瑟,但第二个词是没有意义的。我被要求解密“Btwlzx Dqqes公式| PJ2 Tjhvqujs Iqoqjy BPG Eqfxtx Xcwwtt” – 2014-09-13 12:18:16

+3

@OriaGruber我试图重启在空间计数器。然后我得到了“亚瑟柯南道尔,福尔摩斯和沃森医生”。 – AlexD 2014-09-13 12:36:17