C++实现将一个字符串中的字符替换成另一个字符串的方法
本文实例讲述了C++实现将一个字符串中的字符替换成另一个字符串的方法,分享给大家供大家参考。具体方法如下:
题目要求:
原地实现字符串中的每个空格替换成"%20",例如输入"We are happy", 输出"We%20are%20happy"
被替换的字符串当然不仅仅是空格,上面只是个例子
这是道很好的题目,也是百度面试中的一道题,题目不难,但是问题得考虑全面。这里给出如下实现代码:
#include <iostream> #include <vector> #include <cassert> using namespace std; int findNumberFirst(const char *str, const char *dest, vector<int>& pvec) { if (str == NULL || dest == NULL) return 0; int pos = 0; int lenStr = strlen(str); int lenDest = strlen(dest); if (lenStr < lenDest) return 0; int count = 0; while (pos <= lenStr - lenDest) { if (strncmp(str + pos, dest, strlen(dest)) == 0) { pvec.push_back(pos); pos += lenDest; count++; } else { pos++; } } return count; } int findNumberLast(const char *str, const char *dest, vector<int> &pvec) { if (str == NULL || dest == NULL) return 0; int strLen = strlen(str); int destLen = strlen(dest); if (strLen < destLen) return 0; int pos = 0; while (pos <= strLen - destLen) { if (strncmp(str + pos, dest, strlen(dest)) == 0) { pos += destLen; pvec.push_back(pos - 1); } else { pos++; } } return pvec.size(); } void replaceArray(char *str, const char *src, const char *dest) { if (str == NULL || src == NULL || dest == NULL) return; vector<int> pvec; int strLen = strlen(str); int srcLen = strlen(src); int destLen = strlen(dest); if (strLen < srcLen) return; int posBefore = 0; int posAfter = 0; if (srcLen < destLen) { int count = findNumberLast(str, src, pvec); if (count <= 0) return; posAfter = strLen + count * (destLen - srcLen) - 1; posBefore = strLen - 1; while (count > 0 && posBefore >= 0) { if (pvec[count - 1] == posBefore) { posAfter -= destLen; strncpy(str + posAfter + 1, dest, strlen(dest)); count--; posBefore--; } else { str[posAfter--] = str[posBefore--]; } } } else if (strLen > destLen) { int count = findNumberFirst(str, src, pvec); if (count <= 0) return; posAfter = 0; posBefore = 0; int i = 0; while (count >= 0 && posBefore < strLen) { if (count > 0 && pvec[i] == posBefore) { strncpy(str + posAfter, dest, strlen(dest)); posAfter += destLen; count--; posBefore += srcLen; i++; } else { str[posAfter++] = str[posBefore++]; } } str[posAfter] = '\0'; } } void main() { char *str = new char[100]; if (str == NULL) return; memset(str, '\0', 100); const char *src = " "; const char *dest = "%20"; //case1: 只有1个空格 strcpy(str, " "); replaceArray(str, src, dest); cout << "str: " << str << endl; replaceArray(str, dest, src); cout << "str: " << str << endl; //case2: 两个空格 strcpy(str, " "); replaceArray(str, src, dest); cout << "str: " << str << endl; replaceArray(str, dest, src); cout << "str: " << str << endl; //case3: 正常情况 strcpy(str, "we are happy"); replaceArray(str, src, dest); cout << "str: " << str << endl; replaceArray(str, dest, src); cout << "str: " << str << endl; //case3: 空格在前 strcpy(str, " we are happy"); replaceArray(str, src, dest); cout << "str: " << str << endl; replaceArray(str, dest, src); cout << "str: " << str << endl; //case4: 空格在后 strcpy(str, "we are happy "); replaceArray(str, src, dest); cout << "str: " << str << endl; replaceArray(str, dest, src); cout << "str: " << str << endl; //case4: 没空格 strcpy(str, "wearehappy"); replaceArray(str, src, dest); cout << "str: " << str << endl; replaceArray(str, dest, src); cout << "str: " << str << endl; //case5: 两边一样 strcpy(str, "we are happy"); replaceArray(str, src, dest); cout << "str: " << str << endl; src = "%20"; assert(dest == "%20"); replaceArray(str, dest, src); cout << "str: " << str << endl; }
分析上述代码,很有意思的一个情况是srcLen和destLen或大或小的情形,其边界条件的判定不一样。比如we are happy为例子,从后往前拷贝时,count=2。
在count=0时,恰好将最前面的空格替换完成,we则不用重复拷贝。但是对于从前往后拷贝,当count=0时,最后面的happy将不会被拷贝。
希望本文所述实例对大家C++程序算法设计的学习有所帮助。
上一篇:C++实现打印1到最大的n位数
栏 目:C语言
下一篇:C++设计模式之简单工厂模式实例
本文标题:C++实现将一个字符串中的字符替换成另一个字符串的方法
本文地址:https://www.xiuzhanwang.com/a1/Cyuyan/3351.html
您可能感兴趣的文章
- 04-02c语言没有round函数 round c语言
- 01-10数据结构课程设计-用栈实现表达式求值的方法详解
- 01-10使用OpenGL实现3D立体显示的程序代码
- 01-10深入理解C++中常见的关键字含义
- 01-10求斐波那契(Fibonacci)数列通项的七种实现方法
- 01-10C语言 解决不用+、-、&#215;、&#247;数字运算符做加法
- 01-10使用C++实现全排列算法的方法详解
- 01-10如何查看进程实际的内存占用情况详解
- 01-10c++中inline的用法分析
- 01-10用C++实现DBSCAN聚类算法
阅读排行
本栏相关
- 04-02c语言函数调用后清空内存 c语言调用
- 04-02func函数+在C语言 func函数在c语言中
- 04-02c语言的正则匹配函数 c语言正则表达
- 04-02c语言用函数写分段 用c语言表示分段
- 04-02c语言中对数函数的表达式 c语言中对
- 04-02c语言编写函数冒泡排序 c语言冒泡排
- 04-02c语言没有round函数 round c语言
- 04-02c语言分段函数怎么求 用c语言求分段
- 04-02C语言中怎么打出三角函数 c语言中怎
- 04-02c语言调用函数求fibo C语言调用函数求
随机阅读
- 04-02jquery与jsp,用jquery
- 01-11Mac OSX 打开原生自带读写NTFS功能(图文
- 01-10SublimeText编译C开发环境设置
- 01-10使用C语言求解扑克牌的顺子及n个骰子
- 08-05DEDE织梦data目录下的sessions文件夹有什
- 01-11ajax实现页面的局部加载
- 08-05dedecms(织梦)副栏目数量限制代码修改
- 01-10C#中split用法实例总结
- 01-10delphi制作wav文件的方法
- 08-05织梦dedecms什么时候用栏目交叉功能?