2012-07-15 109 views
0

我寫了一個程序來使用重複字符的計數來壓縮字符串。如果壓縮字符串比原始字符串長,那麼我們仍然返回原始字符串。下面是我的程序:C++字符串壓縮

void stringCompress(char* src) { 
    char* original; 
    original = src; 
    char* rst; 
    rst = src; 

    int histogram[256]; 
    for (int i = 0; i < 256; i++) { 
     histogram[i] = 0; 
    } 
    int length = 0; 
    while (*src != NULL) { 
     length++; 
     src++; 
    } 
    src = original; 
    int j = 0; 

    for (int i = 0; i < length; i++) { 

     histogram[(int) src[i]]++; 
     if (histogram[(int) src[i]] == 1) { 
      rst[j] = src[i]; 

      j++; 

     } 

    } 
    rst[j] = '\0'; 

    char* final; 

    rst = original; 
    int index = 0; 
    char buffer[33]; 

    for (int i = 0; i < j; i++) { 

     final[index] = rst[i]; 

     stringstream number; 
     number<<histogram[(int)rst[i]]; 
------->  //cout<<number.str()<<endl; 
     char* temp = new char[number.str().length()+1]; 
     strcpy(temp, number.str().c_str()); 
     index++; 
     cout<<temp<<endl; 
     for(int k =0 ;k<number.str().length();k++) 
     { 
      final[index]=temp[k]; 
      index++; 

     } 

    } 

    final[index] = '\0'; 
    src = original; 

    if (index <= length) { 
     for (int i = 0; i < index; i++) 

      cout<<final[i]; 
    } else { 
     cout << src << endl; 
    } 

} 

但奇怪的是,如果我離開了COUT句子cout<<number.str()<<endl;有(箭頭指向了一句),則輸出是正確的。例如,aaaabcdaa輸出a6b1c1d1,aabcd輸出aabcd。但是,如果我註釋掉cout<<number.str()<<endl;,則不會生成任何內容。任何幫助表示讚賞。

+0

因爲這基本上是一個C函數,無論如何,你爲什麼不帶'printf'辦呢?如果你想使用C++,你應該做到這一點(使用'std :: string's和RAII風格),只有這樣才能真正帶來好處。 – leftaroundabout 2012-07-15 20:13:30

+0

作爲一個方面說明,您的閱讀器將無法正確讀取有數字的字符串(但是,我不知道您在這裏壓縮哪種字符串,顯然,該算法對正常文本沒有用處)。 – 2012-07-15 20:13:33

+0

我假設字符串只包含字母。其實我也不確定這個算法是用來做什麼的,因爲它基本上是一個面試問題。是的,現在我知道我可以使用printf而不是混合char *和字符串了。謝謝。 – Iam619 2012-07-15 20:47:22

回答

2

變量final未在您的代碼中初始化。當我使用內存緩衝區初始化它時,無論您指向的行是否被註釋掉,程序都會打印所需的輸出。

也許你想用的buffer(即未使用)的內存final,如:

final = buffer; 
+0

是的,它解決了這個問題。但實際上我不知道最後會指出多少個角色,所以我能做的只是給最後的一個相對較大的空間,對吧? – Iam619 2012-07-15 20:55:06

+0

您無法確切知道有多少,但最多可以是輸入字符串長度的兩倍。另一種可能性是使用與輸入字符串大小相同的緩衝區,並在for-i-loop中連續檢查目標字符串是否超出源長度,並在此情況下停止並僅返回源字符串。 – 2012-07-16 05:43:01

+0

謝謝!我認爲這是有道理的。 – Iam619 2012-07-17 00:44:34