2014-09-13 78 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