Chinaunix首页 | 论坛 | 博客
  • 博客访问: 28102
  • 博文数量: 5
  • 博客积分: 10
  • 博客等级: 民兵
  • 技术积分: 49
  • 用 户 组: 普通用户
  • 注册时间: 2012-12-02 23:06
文章分类
文章存档

2014年(2)

2013年(3)

我的朋友

分类: 嵌入式

2013-11-08 08:22:48

公司进行C语言考试,题目是压缩小写字符串。
input: abbcdd
output:a2bc2d
完成压缩函数后自己想了下如果解压缩该怎么实现。
input: a2b10cd
output: abbccccccccccd

函数需要的结构体和宏

点击(此处)折叠或打开

  1. struct rawString
  2. {
  3.     char *str;
  4.     unsigned long len;
  5. };

  6. struct zipString
  7. {
  8.     char *str;
  9.     unsigned long len;
  10. };

  11. #define STR_LEN_MAX 1024
  12. #define NUM_LEN 64
压缩函数

点击(此处)折叠或打开

  1. struct zipString* stringZip(const struct rawString *pInputStr)
  2. {
  3.     char * pStrTemp = NULL;
  4.     char * pStrBox = NULL;
  5.     const struct rawString *pInputTemp = pInputStr;
  6.     struct zipString *pOutputTemp ;
  7.     int i = 0, count = 1, num_len = 0;
  8.     char chTemp = '\0';
  9.     

  10.     if ((NULL == pInputTemp) || (NULL == pInputTemp->str) || (0 == pInputTemp->len)) {
  11.      return NULL;
  12.     }
  13.     if (pInputTemp->len != (unsigned long)strlen(pInputTemp->str)) {
  14.      return NULL;
  15.     }
  16.     

  17.     pStrTemp = (char *)malloc(pInputTemp->len + 1);
  18.     if (NULL == pStrTemp) {
  19.      return NULL;
  20.     }
  21.     pStrBox = pStrTemp;
  22.     memset(pStrTemp, '\0', pInputTemp->len + 1);
  23.     
  24.     while ('\0' != *(pInputTemp->str + i)) {

  25.         if ((*(pInputTemp->str + i) < 'a') || (*(pInputTemp->str + i) > 'z')) {
  26.             free(pStrBox);
  27.             printf("String is wrong!\n");
  28.             return NULL;
  29.         }
  30.         
  31.         chTemp = *(pInputTemp->str + i);

  32.         /*判断当前字符和下一个字符相同*/
  33.         if (chTemp == *(pInputTemp->str + i + 1)) {
  34.             count += 1;
  35.             i++;
  36.             continue;
  37.         } else { /*判断当前字符和下一个字符不同*/

  38.             /*前面不存在与当前相同的字符*/
  39.             if (1 == count) {
  40.                 *pStrTemp = chTemp;
  41.                 pStrTemp ++;
  42.                 i++;
  43.                 continue;
  44.             } else { /*前面存在与当前相同的字符*/

  45.                 while (count != 0) {
  46.                  count /= 10;
  47.                      num_len += 1;
  48.                 }

  49.                 pStrTemp += (num_len + 1);
  50.                 i++;

  51.                 count = 1;
  52.                 num_len = 0;
  53.                 continue;
  54.             }

  55.         }
  56.     }
  57.     *(pStrBox + pInputTemp->len) = '\0';
  58.     
  59.     pOutputTemp = (struct zipString *)malloc(sizeof(struct zipString));
  60.     if (NULL == pOutputTemp) {
  61.         return NULL;
  62.     }
  63.     pOutputTemp->str = pStrBox;
  64.     pOutputTemp->len = strlen(pStrBox);

  65.     return pOutputTemp;
  66. }

解压缩函数

点击(此处)折叠或打开

  1. struct rawString * stringUnZip(const struct zipString *pInputStr)
  2. {
  3.     int i = 0, chNum = 1, copyTime = 0, strLen = 0, numLen = 0;
  4.     char tempStr[STR_LEN_MAX + 1] = {'\0'};
  5.     char tempNum[NUM_LEN + 1] = {'\0'};
  6.     char *pTempStr = tempStr;
  7.     char *pTempNum = tempNum;
  8.     char *pStr = NULL;
  9.     struct rawString * pRawStr = NULL;

  10.     if((NULL == pInputStr) || (NULL == pInputStr->str)) {
  11.         return NULL;
  12.     }

  13.     if(pInputStr->len != strlen(pInputStr->str)) {
  14.         return NULL;
  15.     }

  16.     while(*(pInputStr->str + i) != '\0') {
  17.         /*判断是否是非法字符*/
  18.         if(((*(pInputStr->str + i) < '0') || (*(pInputStr->str + i) > '9')) &&
  19.                 ((*(pInputStr->str + i) < 'a') || (*(pInputStr->str + i) > 'z'))) {
  20.             return NULL;
  21.         }

  22.         if ((*(pInputStr->str + i) >= 'a') && (*(pInputStr->str + i) <= 'z')) {
  23.             if(strLen > (STR_LEN_MAX)) {
  24.                 printf("Strlen is too long!\n");
  25.                 return NULL;
  26.             }

  27.             /*前一位不是数字*/
  28.             if(0 == numLen) {
  29.                 sprintf(pTempStr, "%c", *(pInputStr->str + i));
  30.                 pTempStr++;
  31.                 strLen++; /*计算总长度*/                
  32.             } else if (numLen > 0) { /*遇到数字后第一个字符*/
  33.                 /*在保留*/
  34.                 tempNum[numLen] = '\0';
  35.                 copyTime = atoi(tempNum);
  36.                 while (copyTime > 0) {
  37.                     sprintf(pTempStr, "%c", *(pInputStr->str + i));
  38.                     pTempStr++;
  39.                     strLen++; /*计算总长度*/
  40.                     copyTime--;
  41.                 }
  42.                 numLen = 0;
  43.             } else {
  44.                 printf("charactor is wrong!\n");
  45.                 return NULL;
  46.             }
  47.             i++;
  48.             continue;
  49.         } else {
  50.             numLen += 1;

  51.             /*数字最长64位*/
  52.             if(numLen > (NUM_LEN)) {
  53.                 return NULL;
  54.             }
  55.             /*第一个数字或一组新数字的第一个数*/
  56.             if(1 == numLen) {
  57.                 /*第一个数字是0*/
  58.                 if('0' == *(pInputStr->str + i)) {
  59.                     numLen = 0;
  60.                     i++;
  61.                     continue;
  62.                 }
  63.                 memset(tempNum, '\0', NUM_LEN);
  64.                 pTempNum = tempNum;
  65.             }
  66.             sprintf(pTempNum, "%c", *(pInputStr->str + i));
  67.             pTempNum++;
  68.             i++;
  69.             continue;
  70.         }
  71.     }
  72.     
  73.     tempStr[STR_LEN_MAX] = '\0';

  74.     pStr = (char *)malloc(STR_LEN_MAX + 1);
  75.     if(NULL == pStr) {
  76.         return NULL;
  77.     }
  78.     memset(pStr, '\0', STR_LEN_MAX + 1);
  79.     sprintf(pStr, "%s", tempStr);

  80.     pRawStr = (struct rawString *)malloc(sizeof(struct rawString));
  81.     if(NULL == pRawStr) {
  82.         return NULL;
  83.     }

  84.     pRawStr->str = pStr;
  85.     pRawStr->len = strlen(pRawStr->str);

  86.     return pRawStr;
  87. }



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