字符串压缩
比如:“xxxyyyyz"压缩后字符串为"3x4yz”
“yyyyyyy"压缩后为"7y”
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
void CutString(char* str){
assert(str);
char* p1 = str;
char* p2 = str;
while (*p2){
char count = '1';
if (*p2 == *(p2 + 1)){
while (*p2 == *(p2 + 1)){
count++;
p2++;
}
*p1 = count;
p1++;
*p1 = *p2;
p1++;
p2++;
*p1 = *p2;
}
else {
p1++;
p2++;
*p1 = *p2;
}
}
p1++;
*p1 = '\0';
}
int main(){
char str[] = "xxxyyyyz";
CutString(str);
puts(str);
system("pause");
return 0;
}
这样做的话,由于我们用的是char count所以只能表示字符’1’-‘9’,否则就会变成ASCII码所对应的符号
所以对代码进行修改
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
//将代码进一步优化
//暂时只考虑1-99
void CutStringP(char* str){
assert(str);
char* p1 = str;
char* p2 = str;
while (*p2){
int count = 1;
if (*p2 == *(p2 + 1)){
while (*p2 == *(p2 + 1)){
count++;
p2++;
}
if (count <= 9){
*p1 = count + '0';
p1++;
*p1 = *p2;
p1++;
p2++;
*p1 = *p2;
}
else {
*p1 = count / 10 + '0';
p1++;
*p1 = count % 10 + '0';
p1++;
*p1 = *p2;
p1++;
p2++;
*p1 = *p2;
}
}
else {
p1++;
p2++;
*p1 = *p2;
}
}
p1++;
*p1 = '\0';
}
int main(){
//char str[] = "xxxyyyyz";
char str[] = "xxxxxxxxxxxxxxxzyyyyyyyyyyyyyyyyyyyyyyyyyyyyz";
CutStringP(str);
puts(str);
system("pause");
return 0;
}
相应的多达3位数的重复这样也可以实现,但是这样的方法显得代码有些冗长。
更好的方法希望大牛们多多指点。