任意一串字符串 字符串里包含数字部分和一般的字符
例如 ad2ef35adx1wewe76
注意这个字符串 里面有4个数字 分别是 1 2 35 76 不考虑大数
将数字按照从小到大排序 组成一个新的字符串
要求制作一个函数来进行处理
假设是 fun(char*src,char*des)
{
}
src 输入字符串 ad2ef35adx1wewe76
des 输出字符串 1-2-35-76
第一步,建立一个缓冲,删除所有的字母
留下 2-35-1-76 这个应该没什么难度的.
再一步 使用 strtok ,
如果可以使用容器就比较简单,往容器里塞,然后容器排序
,如果不能使用容器,都要自己造轮子,哪就麻烦一点了
#include <iostream> // 数据流输入/输出
#include <string> // 字符串类
#include <algorithm> // STL 通用算法
#include <vector> // STL 动态数组容器
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <ctype.h>
#define TOKEN '-'
using namespace std;
bool strsize(const string& i, const string& j);
char* Extraction_sequence(const char* src, char* des);
int main()
{
char output[100];
Extraction_sequence("ad2e99f35a0dx1we5465d修正465465w000e76", output);
printf("%s\n", output);
return 0;
}
bool strsize(const string& i, const string& j) // 排序谓语函数
{
if (i.size() == j.size()) // 如果长度相同,就按字典序
return (i < j);
return (i.size() < j.size()); // 默认按长度排
}
char* Extraction_sequence(const char* src, char* des)
{
char* ret = des; // 返回指针
char* buf = new char[strlen(src) + 1]; // 缓冲buf
char* c_buf = buf;
// 提取字符串中的数字
while (*src) {
if (isdigit(*src)) {
*c_buf++ = *src;
if (!isdigit(*(src + 1))) // 数字后面添加 分割标记
*c_buf++ = TOKEN ;
}
src++;
}
*(c_buf - 1) = '\0'; // 封闭字符串
/* 排序数字序列*/
vector <string> seq;
vector <string>::iterator iter;
char* pch;
pch = strtok(buf, "-");
while (pch != NULL) {
seq.push_back(pch); //2 35 1 76 置入到容器里
pch = strtok(NULL, "-");
}
sort(seq.begin(), seq.end(), strsize); //按数字长度和大小排列
iter = seq.begin();
des[0] = '\0'; // des 清零
while (iter != seq.end()) {
strcat(des, (iter++)->c_str()) ;
strcat(des, "-") ;
}
des[strlen(des) - 1] = '\0'; // des 消除最后的 标记'-'
delete[] buf;
return ret;
}