2.
通过键盘输入一串小写字母(a~z)组成的字符串。请编写一个字符串压缩程序,将字符串中连续出席的重复字母进行压缩,并输出压缩后的字符串。
压缩规则:
1、仅压缩连续重复出现的字符。比如字符串"abcbc"由于无连续重复字符,压缩后的字符串还是"abcbc"。
2、压缩字段的格式为"字符重复的次数+字符"。例如:字符串"xxxyyyyyyz"压缩后就成为"3x6yz"。
要求实现函数:
void stringZip(const char *pInputStr, long lInputLen, char *pOutputStr);
【输入】 pInputStr: 输入字符串
lInputLen: 输入字符串长度
【输出】 pOutputStr: 输出字符串,空间已经开辟好,与输入字符串等长;
【注意】只需要完成该函数功能算法,中间不需要有任何IO的输入输出
示例
输入:“cccddecc” 输出:“3c2de2c”
输入:“adef” 输出:“adef”
输入:“pppppppp” 输出:“8p”
-
#include <stdio.h>
-
#include <stdlib.h>
-
#include <string.h>
-
-
//字符串"xxxyyyyyyz"压缩后就成为"3x6yz"
-
void stringZip(const char *pInputStr, long lInputLen, char *pOutputStr) {
-
char *pInStrPre, *pInStrPost;
-
int iCount;
-
-
iCount = 1;
-
pInStrPre = pInStrPost = pInputStr;
-
-
memset(pOutputStr, 0, lInputLen);
-
-
while (*pInStrPre != '\0') {
-
if (*pInStrPost == *++pInStrPre)
-
iCount++;
-
else {
-
sprintf(pOutputStr, "%d%c", iCount, *pInStrPost);
-
pOutputStr = pOutputStr + strlen(pOutputStr);
-
pInStrPost = pInStrPre;
-
iCount = 1;
-
}
-
}
-
}
-
int main(void) {
-
//puts("!!!Hello World!!!"); /* prints !!!Hello */
-
char input[] = "pppppppppppabcd";
-
char *output = (char *) malloc(strlen(input) + 1);
-
stringZip(input, strlen(input), output);
-
printf("%s", output);
-
return EXIT_SUCCESS;
-
}
不使用库函数的方式
-
//字符串"xxxyyyyyyz"压缩后就成为"3x6yz"
-
void stringZip(const char *pInputStr, long lInputLen, char *pOutputStr) {
-
char *pInStrPre, *pInStrPost;
-
int iCount;
-
-
pInStrPre = pInStrPost = pInputStr;
-
-
for (iCount = 0; iCount < lInputLen; iCount++)
-
pOutputStr[iCount] = '\0';
-
-
while (*pInStrPre != '\0') {
-
if (*pInStrPost != *++pInStrPre) {
-
iCount = pInStrPre - pInStrPost;
-
-
while (iCount / 10) {
-
*pOutputStr++ = iCount % 10 + '0';
-
iCount /= 10;
-
}
-
*pOutputStr++ = iCount + '0';
-
-
*pOutputStr++ = *pInStrPost;
-
pInStrPost = pInStrPre;
-
}
-
}
-
}
阅读(432) | 评论(0) | 转发(0) |