1 #define _CRT_SECURE_NO_WARNINGS
2 #include <stdio.h>
3
4 #include <malloc.h>
5 #include <string.h>
6 /*
7 功能:
8 通过键盘输入一串小写字母(a~z)组成的字符串。请编写一个字符串压缩程序,将字符串中连续出席的重复字母进行压缩,并输出压缩后的字符串。
9 压缩规则:
10 1、仅压缩连续重复出现的字符。比如字符串"abcbc"由于无连续重复字符,压缩后的字符串还是"abcbc"。
11 2、压缩字段的格式为"字符重复的次数+字符"。例如:字符串"xxxyyyyyyz"压缩后就成为"3x6yz"。
12 要求实现函数:
13 void stringZip(const char *pInputStr, long lInputLen, char *pOutputStr);
14 【输入】 pInputStr: 输入字符串
15 lInputLen: 输入字符串长度
16 【输出】 pOutputStr: 输出字符串,空间已经开辟好,与输入字符串等长;*/
17 void stringZip(const char *pInputStr, long lInputLen, char *pOutputStr);
18
19 int main()
20 {
21 char inputStr[100];
22 char outputStr[100];
23
24 memset(inputStr, '\0', sizeof(char) * 100);//清空操作
25 memset(outputStr, '\0', sizeof(char) * 100);
26
27 gets(inputStr);
28 stringZip(inputStr, strlen(inputStr), outputStr);//数组地址 长度 最后放入的数组
29
30 printf("%s", outputStr);
31
32 getchar();
33
34 return 0;
35 }
36
37 void stringZip(const char *pInputStr, long lInputLen, char *pOutputStr)
38 {
39 char cTemp;
40 int i;
41 int count = 1;
42 char tempStr[20];
43
44 memset(tempStr, '\0', sizeof(char) * 20);
45
46 for (i = 1; i <= lInputLen; i++)
47 {
48 cTemp = pInputStr[i - 1];//这里注意循环从1开始 后一个和前一个比较相等就计数
49 if (cTemp == pInputStr[i])
50 {
51 count++;
52 continue; //结束这次循环
53 }
54 else
55 {
56 if (count == 1)//如果还是最初的值 也就是没有相邻重复的
57 {
58 sprintf(tempStr, "%c", cTemp);//输出到字符串
59 //printf("%s", tempStr);
60 //getchar();
61
62 strcat(pOutputStr, tempStr);
63 memset(tempStr, '\0', sizeof(char) * 20);
64 }
65 else//有重复的情况
66 {
67 sprintf(tempStr, "%d%c", count, cTemp);
68 strcat(pOutputStr, tempStr);
69 memset(tempStr, '\0', sizeof(char) * 20);
70 }
71 count = 1;
72 }
73 }
74 }