Chinaunix首页 | 论坛 | 博客
  • 博客访问: 260454
  • 博文数量: 128
  • 博客积分: 65
  • 博客等级: 民兵
  • 技术积分: 487
  • 用 户 组: 普通用户
  • 注册时间: 2012-07-24 17:43
个人简介

人生境界:明智、中庸、诚信、谦逊

文章分类

全部博文(128)

文章存档

2014年(12)

2013年(116)

我的朋友

分类: C/C++

2013-10-09 16:12:56

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”

点击(此处)折叠或打开

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>

  4. //字符串"xxxyyyyyyz"压缩后就成为"3x6yz"
  5. void stringZip(const char *pInputStr, long lInputLen, char *pOutputStr) {
  6.     char *pInStrPre, *pInStrPost;
  7.     int iCount;

  8.     iCount = 1;
  9.     pInStrPre = pInStrPost = pInputStr;

  10.     memset(pOutputStr, 0, lInputLen);

  11.     while (*pInStrPre != '\0') {
  12.         if (*pInStrPost == *++pInStrPre)
  13.             iCount++;
  14.         else {
  15.             sprintf(pOutputStr, "%d%c", iCount, *pInStrPost);
  16.             pOutputStr = pOutputStr + strlen(pOutputStr);
  17.             pInStrPost = pInStrPre;
  18.             iCount = 1;
  19.         }
  20.     }
  21. }
  22. int main(void) {
  23.     //puts("!!!Hello World!!!"); /* prints !!!Hello */
  24.     char input[] = "pppppppppppabcd";
  25.     char *output = (char *) malloc(strlen(input) + 1);
  26.     stringZip(input, strlen(input), output);
  27.     printf("%s", output);
  28.     return EXIT_SUCCESS;
  29. }
不使用库函数的方式


点击(此处)折叠或打开

  1. //字符串"xxxyyyyyyz"压缩后就成为"3x6yz"
  2. void stringZip(const char *pInputStr, long lInputLen, char *pOutputStr) {
  3.     char *pInStrPre, *pInStrPost;
  4.     int iCount;

  5.     pInStrPre = pInStrPost = pInputStr;

  6.     for (iCount = 0; iCount < lInputLen; iCount++)
  7.         pOutputStr[iCount] = '\0';

  8.     while (*pInStrPre != '\0') {
  9.         if (*pInStrPost != *++pInStrPre) {
  10.             iCount = pInStrPre - pInStrPost;

  11.             while (iCount / 10) {
  12.                 *pOutputStr++ = iCount % 10 + '0';
  13.                 iCount /= 10;
  14.             }
  15.             *pOutputStr++ = iCount + '0';

  16.             *pOutputStr++ = *pInStrPost;
  17.             pInStrPost = pInStrPre;
  18.         }
  19.     }
  20. }

阅读(432) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~