2014-11-22 28 views
3

我需要創建功能:如何decompres字符數組在C

char * decompress(const char * src) { 
} 

輸入這個功能是一些字符串:

Hello world! -> Hello world! 

Hel2o world!10" -> Hello world!!!!!!!!!! 

,你可以看到,如果有一些數字是重複此前的字符次數。我是java程序員,但現在我需要在c中解決這個問題;

我現在有這個。它只是打印我希望正確的價值,但我不知道如何分配它返回指針

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

char * decompress(const char * src) { 
    int max = 0; 
    int pom = 1; 

    char *vysledek = ""; 
    int i; 
    for (i = 0; i < strlen(src); i++) { 
     max = 0; 
     pom = 1; 

     while (isdigit(src[i])) { 
      int digit = (src[i] - '0'); 
      max = max * 10 + digit; 
      i++; 
      pom++; 
     } 

     if (max == 0) { 
      max = 1; 
     } 

     int j; 
     for (j = 0; j < max; j++) { 
      printf("%c", src[i - pom]); 
     } 
    } 

    return vysledek; 
} 

int main(int argc, char * argv []) { 

    decompress("Hel2o world!10"); 

    return 0; 
} 
+3

如果代碼的其餘部分工作,您需要做一些小的修改:將內存分配給您的輸出字符串,然後將字符添加到它。然而,問題仍然是你應該爲你的字符串分配多少內存。你可以使用一個靜態值(這將適用於所有長度),近似值,或者運行一個單獨的循環來首先計算出你需要多少空間。另一個選擇是動態分配一定數量的內存,然後分配兩倍的大小,如果填滿並複製內容。 – Nit 2014-11-22 11:49:32

+2

你的代碼中有UB,就像在外循環的第一次迭代中一樣,內循環的內循環print src [-1]' – 2014-11-22 11:53:35

回答

1

既然你提到,你是一個Java程序員,你應該考慮如何C內存分配(在這種情況下,尤其是字符串)工作:

char *vysledek = ""; 

在Java中,這將創建一個字符串對象,在那裏你可以簡單地添加字符在你的意志。然而,在C中,這基本上會創建一個char[1]的數組,其中包含'\0'(字符串終止字符)。因爲 - 就像Java的數組 - 你不能(不應該)在數組的邊界之外寫,你可以在這個數組中存儲一個字符,這對你的函數來說是沒有足夠內存的。

您可以通過首先迭代輸入來找出需要分配多少內存(如Nit在他的評論中提到的那樣)。然後,你可以malloc必要的內存爲輸出指針:

vysledek = malloc (<output string length>); 


現在你已經分配了足夠的內存,你可以寫你的輸出到這個陣列,這樣反而

printf("%c", src[i - pom]); 

您現在可以編寫:

vysledek[vysledek_counter++] = src[i - pom]; 

並返回指針。


請注意,您應該釋放返回的值,你用它做之後,即使是你的主要方法的結束,這應該是這個樣子:

int main(int argc, char * argv []) { 
    char *output; 

    output = decompress("Hel2o world!10"); 
    printf("%s\n", output); 
    free(output); 

    return 0; 
} 

另外需要注意的是:如果遇到非終止字符串(即沒有0​​字符表示字符串結束),您的代碼將失敗。爲了解決這個問題,請傳遞一個額外的字符串長度參數(您必須自己在返回的char數組中設置'\0'字符,併爲該指針保留一個附加字節的內存)。它在第一次迭代中也有未定義的行爲(如Cool Guy指出的那樣),因爲pom總是至少爲1,導致i - pom,因此試圖訪問src[-1]

+0

我仍然對指針感到困惑。我試過你的例子,但它仍然無法正常工作。當我printf(「%c \ n」,vysledek [0]);它什麼都不返回 printf(「%c \ n」,vysledek [1]);返回H(爲什麼)和printf(「%s \ n」,vysledek);返回也沒有什麼爲什麼 – hudi 2014-11-22 14:07:53

+0

我認爲在這種情況下,混淆源自C: 中的字符串每當遇到「\ 0」字符時,處理字符串(包括printf)的大多數函數將停止處理字符串,因爲沒有辦法告訴數組的長度(以及字符串的長度)。我編輯了我的答案,但是你現在面臨的問題是:當你的循環開始時,'vysledek'中的第一個字符被設置爲'src [-1]';這可以將第一個字符設置爲「'\ 0'',因此顯示爲空字符串。 (注意:''\ 0'== 0',因此'printf(「%d」,vysledek [0]);'會打印出0) – SebiH 2014-11-22 14:22:13

+0

其他一些錯誤:讀取一個數字後,而無需將其寫入目標陣列。 (當你的'isdigit'循環完成時,它指向 - 例如'o',在目標數組中讀取'l'兩次(現在3'l'存在於數組中,因爲第一個讀入數組在檢測到任何數字之前),並再次增加計數器'i'而不讀入'o'。 – SebiH 2014-11-22 14:34:05