您的位置:首页 > 其它

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

2011-09-11 10:58 197 查看
任意一串字符串 字符串里包含数字部分和一般的字符

例如 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];   // 缓冲bufchar* 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;}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐