从字符串中提取数字,然后按长度和字典序排列

来源:互联网 发布:大闹天宫玉玺4进5数据 编辑:程序博客网 时间:2024/06/05 05:35
任意一串字符串 字符串里包含数字部分和一般的字符例如 ad2ef35adx1wewe76注意这个字符串 里面有4个数字 分别是 1 2 35 76 不考虑大数将数字按照从小到大排序 组成一个新的字符串要求制作一个函数来进行处理假设是 fun(char*src,char*des)  {  }src 输入字符串 ad2ef35adx1wewe76des 输出字符串 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;}