我寫了一個程序來使用重複字符的計數來壓縮字符串。如果壓縮字符串比原始字符串長,那麼我們仍然返回原始字符串。下面是我的程序: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;
,則不會生成任何內容。任何幫助表示讚賞。
因爲這基本上是一個C函數,無論如何,你爲什麼不帶'printf'辦呢?如果你想使用C++,你應該做到這一點(使用'std :: string's和RAII風格),只有這樣才能真正帶來好處。 – leftaroundabout 2012-07-15 20:13:30
作爲一個方面說明,您的閱讀器將無法正確讀取有數字的字符串(但是,我不知道您在這裏壓縮哪種字符串,顯然,該算法對正常文本沒有用處)。 – 2012-07-15 20:13:33
我假設字符串只包含字母。其實我也不確定這個算法是用來做什麼的,因爲它基本上是一個面試問題。是的,現在我知道我可以使用printf而不是混合char *和字符串了。謝謝。 – Iam619 2012-07-15 20:47:22