我之前的思路是引入count2作为不同字母的个数从而确定压缩后字符串的下标,而且在下面的for循环的else分支是这样赋值的:
q[2*count2] = p[i];
q[2*count2+1] = '0' + count1;
显然这是错误的,当count1>=10时,就会发生越界错误。
这里感谢一起学习的大佬提供的思路,使用sprintf能有效解决这个问题,其返回值正好可以帮助确定下标。
```c
char * compressString(char * S)
{
int len = strlen(S);
int clen;
char *q = (char *)malloc(sizeof(char)*(2*len));
int count1 = 1;//统计相同字母的个数
int count2 = 0;//确定输出字符串的下标
if(len <= 2)
{
return S;
}
for(int i = 1;i < len+1 ; ++i)
{
if(S[i-1] == S[i])
{
count1++;
}
else
{
q[count2++] = S[i-1];
clen = sprintf(&q[count2],"%d",count1);
count2 += clen;
count1 = 1;
}
}
q[count2] = '\0';
clen = strlen(q);
if(clen < len)
{
return q;
}
return S;
}