2013-01-07 111 views
-1

我想做一個程序,做RLE壓縮輸入字符串,給用戶,但是當我嘗試運行它時,我帶有分段faut錯誤,但我不知道我的錯誤在哪裏...RLE壓縮在c

這裏是我的代碼:

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

char * rle_convert(char str[500]); 

char str_out[500]; 

int main(void) { 
    char str[500]; 
    printf("give a string : "); 
    fgets (str, 500, stdin); 
    strcpy(str,rle_convert(str)); 
    printf("%s",str); 
} 

char * rle_convert(char str[500]) { 
    int i,j,k=0,sum; 
    for (i=0; i<(strlen(str)-1); i+sum) { 
      sum=1; 
      for (j=i; str[j]==str[j++]; j++) sum++; 
      if (sum>1) { 
        str_out[k]=sum+48; 
        str_out[k++]=str[i]; 
      } 
      else str_out[k]=str[i]; 
      k++; 
    } 
    return str_out; 
} 
+0

在2個或更多語句中重寫'for(j = i; str [j] == str [j ++]; j ++)sum ++;'。 – pmg

+0

爲什麼不在程序中的某些戰略點處使用printf(),以瞭解哪些代碼部分運行以及哪些部分不運行?通過這種方式,您可以更好地瞭解將調試工作集中在哪裏。 – mcvz

+0

另一個字符串終止錯誤。 –

回答

1

一個錯誤是在這裏:

for (i=0; i<(strlen(str)-1); i+sum) { 
          ^^^^^ 

您的意思是寫i += sum

另一個缺陷是由於在雙增量:

 for (j=i; str[j]==str[j++]; j++) sum++; 
           ^^^ ^^^ 
1

一件事,我看到了蝙蝠是,你在每個迭代遞增j兩次。也許你的意思是str[j] == str[j+1]。但是,即使你這樣做了,在這個嵌套循環中,你仍然可以到達你的數組邊界之外的領域。您需要確保不僅上述條件成立,而且str[j]仍在有效範圍內。

後來,你說

str_out[k]=sum+48; 
str_out[k++]=str[i]; 

這絕對不是你想要的。你想要的可能是str_out[k++]這兩個作業,否則第二個作業會取消第一個作業。

然後,如果sum等於1,則不保存重複計數,只保存字符。我懷疑這就是你想要的,因爲解碼結果數組的代碼將無法區分計數和值。因此,您可能希望在兩種情況下都使用if正文(非條件)。

此外,正如在另一個答案中提到的那樣,第一個循環將一直持續下去,因爲您在外部for循環的步驟部分中沒有遞增i