//代码有参考<a target=_blank href="http://codepad.org/6Fd8V6z0">http://codepad.org/6Fd8V6z0</a>
#define _CRT_SECURE_NO_WARNIGNS//程序看起来有点复杂是因为考虑到字母数大于9个的时候,需要转换一下存进字符串,最后的字符串保存在了一个字符数组内了
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int number_to_char(int number, char *char_new)//将int型转换成字符型存进字符数组
{
int ret = 0;
if (char_new == NULL)
{
return -1;
}
int bit = 1;
int tmp = number;
int i = 0;
while (tmp /= 10)
{
bit++;
}
for (i = bit - 1; i >= 0; i--)
{
char_new[i] = (number % 10)+48;
number /= 10;
}
return ret;
}
int del_other_char(char *str_old, char *str_new)//删除除了字母以外的任何字符
{
int ret = 0;
if (str_old == NULL || str_new == NULL)
{
return -1;
}
while (*str_old != '\0')//去除除了小写字母以外的任何字符,拷贝到新的字符串中
{
if (*str_old >= 'a' && *str_old <= 'z')
{
*str_new++ = *str_old;
}
str_old++;
}
*str_new = '\0';
return ret;
}
int change_str(char *str_old, char *str_new)
{
int ret = 0;
if (str_old == NULL || str_new == NULL)
{
return -1;
}
int str[128] = { 0 };//不会超出字母对应的ASCII码
while (*str_old != '\0')
{
str[(int)*str_old++]++;
if (*str_old != *(str_old - 1))//如果到了不相同的交界处
{
int i = 0;
char number[20] = { 0 };
ret = number_to_char(str[(int)*(str_old - 1)], number);
if (ret != 0)
{
printf("ERROR!!! func number_to_char()");
return ret;
}
*str_new++ = *(str_old - 1);
//*str_new++ = str[(int)*(str_old - 1)]+48;//只能打印小于10的数字
for (i = 0; number[i] != '\0'; i++)//将转换的字符存入字符串
{
*str_new++ = number[i];
}
str[(int)*(str_old - 1)] = 0;//记录一次之后要清零,防止下此再出现该字母次数会叠加
}
}
*str_new = '\0';
return ret;
}
int main()
{
int ret = 0;
char *str_old = "23423aaaaaaaaaaaaabbbbbdddddawewewew323eeee eee2323tyuttt";
char str_new1[100];
char str_new2[100];
ret = del_other_char(str_old, str_new1);
if (ret != 0)
{
printf("ERROR!!! func del_other_char()");
return ret;
}
ret = change_str(str_new1, str_new2);
if (ret != 0)
{
printf("ERROR!!! func change_str()");
return ret;
}
printf("%s", str_new2);
system("pause");
}