从字符串中提取数字,然后按长度和字典序排列
来源:互联网 发布:大闹天宫玉玺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;}