|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
题目:在长度为n的字符串t中连续出现相同字符的个数
不超过9个,函数void fun(char t[],int n)按
如下规则进行处理,若有连续出现两个及以上相
同的字符时,将这些连续的字符表示成m*x的形式
(m为该字符,x为该字符出现的次数)。
例如:原字符串为"cccaeeeeebkkkkd",经过处理后的字符串为
"c*3ae*5bk*4d"。
在 /**********Program**********/
/********** End **********/
中填空
#include <stdio.h>
#include <string.h>
void fun(char t[],int n)
{
int i,k,m,j;
i=0;
while(i<n-1)
{
k=i+1;
while(t[k]==t[i])
k++;
m=k-i;//尾标-首标
/**********Program**********/
/********** End **********/
}
}
int main()
{
char s[100]="cccaeeeeebkkkkd";
int n;
n=strlen(s);
printf("压缩前的数据: ");
puts(s);
fun(s,n);
printf("压缩后的数据: ");
puts(s);
return 0;
}
题目的要求是编写一个压缩字符串的功能,我们需要在需要添加的部分生成一个以 "m*x" 格式的字符串,表示连续的字符及其出现的次数。
在提供的代码中,我们已经得到了连续字符的首尾位置以及出现次数(m). 于是我们可以遵循以下步骤:
1、如果 m(出现的次数)大于1,则我们需要进行压缩。
2、因为新添加的串可能会增加总的字符数目,我们创建一个临时的数组来存储新生成的压缩字符串。
3、在临时数组中添加字符 m 和 '*'。
4、转换字符数 m 为字符串,并添加到临时数组。
5、然后,把原来字符串中在位置 k 之后的部分复制到新的位置。这部分仍需要保持原始的顺序。
6、在临时数组的最后添加 '\0' 来表示字符串结束。
这部分的代码将会这样的:
- if(m > 1){
- char temp[100];
- j = 0;
- while(j<i){
- temp[j]=t[j];
- j++;
- }
- temp[j++]=t[i];
- temp[j++]='*';
- sprintf(temp+j, "%d", m);
- j += strlen(temp+j);
- strcpy(temp+j, t+k);
- strcpy(t, temp);
- n = strlen(t);
- }
- i=k;
复制代码
所以完整的程序应当如下:
- #include<stdio.h>
- #include<string.h>
- void fun(char t[], int n){
- int i, k, m, j;
- i = 0;
- while(i < n-1){
- k = i + 1;
- while(t[k] == t[i])
- k++;
- m = k - i;
- if(m > 1){
- char temp[100];
- j = 0;
- while(j<i){
- temp[j]=t[j];
- j++;
- }
- temp[j++]=t[i];
- temp[j++]='*';
- sprintf(temp+j, "%d", m);
- j += strlen(temp+j);
- strcpy(temp+j, t+k);
- strcpy(t, temp);
- n = strlen(t);
- }
- i=k;
- }
- }
- int main(){
- char s[100] = "cccaeeeeebkkkkd";
- int n;
- n = strlen(s);
- printf("压缩前的数据:");
- puts(s);
- fun(s, n);
- printf("压缩后的数据:");
- puts(s);
- return 0;
- }
复制代码
这个程序会将 "cccaeeeeebkkkkd" 转换为 "c3a5b*4d"。
|
|