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++程序算法设计的学习有所帮助。

(0)

相关推荐

  • c++ String去除头尾空格的方法

    本文实例讲述了c++ String去除头尾空格的方法,分享给大家供大家参考.具体实现方法如下: 实现该功能可使用string的find_first_not_of,和find_last_not_of方法,具体实现带如下: 复制代码 代码如下: #include <iostream> #include <string> std::string& trim(std::string &); int main() {     std::string s = " He

  • 基于C++字符串替换函数的使用详解

    在C++中,字符串替换有很多方法,这里主要说一下STL里的WString中的替换,虽然WString自带了一个Replace函数,但是只能替换一次,太不好了,因此单独写了个替换函数[函数] 复制代码 代码如下: /**         * @brief   实现字符串替换         * @param   orignStr 源串         * @param   oldStr  查找的串         * @param   newStr  替换的新串         * @return

  • 实现去除c语言注释的小工具

    去除C代码中的注释,1. 单行注释//:2. 多行注释/**/:3. 单行注释以"\"结尾则下一行也为注释:4. 字符串中的注释不处理.说是C语言,但其实所有C语系的都可以,比如Java. 小工具:去除C语言注释  复制代码 代码如下: #include <stdio.h> int main(int argc, char* argv[]) {  enum {    literal,    single,    multiple,    string  } mode = li

  • c++线程池实现方法

    本文实例讲述了c++线程池实现方法.分享给大家供大家参考.具体分析如下: 下面这个线程池是我在工作中用到过的,原理还是建立一个任务队列,让多个线程互斥的在队列中取出任务,然后执行,显然,队列是要加锁的 环境:ubuntu linux 文件名:locker.h #ifndef LOCKER_H_ #define LOCKER_H_ #include "pthread.h" class locker { public: locker(); virtual ~locker(); bool l

  • c++ 尽量不要使用#define 而是用const、enum、inline替换。

    例如:这里程序文件开头有如下#define语句 复制代码 代码如下: #define N 10 #define PI 3.14 #define MAX 10000 #define Heigth 6.65 ... ... 假设这里程序运行出错误,而且就是在我们使用这些常量有错误,此时编辑器应该会抛出错误信息.如果该信息提示6.65这里有错误,Ok如果你运气好你正好记得或者程序简单一眼能找到6.65表示什么,如果程序很复杂,而且报出6.65的文件是引用该文件,不记得,那么你会困惑这是什么?或许会花大

  • C++抽奖程序实现方法

    本文实例讲述了C++抽奖程序实现方法.分享给大家供大家参考.具体实现方法如下: 一.int rand()可以生成从[0, 65536)之间均匀分布的随机数. 现要求实现:有30万员工,使用rand()写一个抽奖程序,抽出人100获奖. #include <iostream> #include <set> using namespace std; typedef set<int> ISET; ISET GetPridePersonId(const int num, con

  • C++去除输入行中空白的方法

    本文实例讲述了C++去除输入行中空白的方法.分享给大家供大家参考.具体实现方法如下: /* * 删除每个输入行末尾的空格及制表符, 并删除完全是空格的行 */ #include <stdio.h> //每一行存放不超过1000个字符,最多输入不超过1000行 #define MAX 1000 int getline(char line[],int limit); main() { int nn; int i=0,j,k; char line[MAX]; char saveline[MAX][M

  • C++实现将一个字符串中的字符替换成另一个字符串的方法

    本文实例讲述了C++实现将一个字符串中的字符替换成另一个字符串的方法,分享给大家供大家参考.具体方法如下: 题目要求: 原地实现字符串中的每个空格替换成"%20",例如输入"We are happy", 输出"We%20are%20happy" 被替换的字符串当然不仅仅是空格,上面只是个例子 这是道很好的题目,也是百度面试中的一道题,题目不难,但是问题得考虑全面.这里给出如下实现代码: #include <iostream> #inc

  • SQL中字符串中包含字符的判断方法

    在sql中我判断包含字符串我们可使用很多方法,如like,replace,charindex函数都可实现我们要的功能,下面我来给各位介绍判断字符串包含字符串sql语句. 通过2个函数CHARINDEX和PATINDEX以及通配符的灵活使用 函数:CHARINDEX和PATINDEX CHARINDEX:查某字符(串)是否包含在其他字符串中,返回字符串中指定表达式的起始位置. PATINDEX:查某字符(串)是否包含在其他字符串中,返回指定表达式中某模式第一次出现的起始位置:如果在全部有效的文本和

  • 使用Python去除字符串中某个字符的多种实现方式比较

    目录 1.如何去掉字符串中不需要的字符? 2.代码演示 总结 1.如何去掉字符串中不需要的字符? 实际案例: (1)过滤掉用户输入前后多余的空白字符:' nick2008@gmail.com ' (2)过滤某windows下编辑文本中的'\r':'hello world\r\n' (3)去掉文本中的unicode组合符号(调音):u'ní hǎo, chī fàn'(或 èěéēàǎā) 解决方案: 方法1:字符串strip(),lstrip(),rstrip()方法去掉字符串两端字符. 方法2

  • 一文带你了解C++中的字符替换方法

    目录 一.单个字符替换 1.1 std::replace 1.2 使用循环手动替换 1.3 使用正则表达式库(例如,std::regex_replace) 二.字符串替换 2.1 实用字符串流 2.2 使用字符数组 2.3 使用 STL 的算法:std::replace 2.4 使用正则表达式 三.总结 一.单个字符替换 1.1 std::replace 代码示例: #include <algorithm> // ... std::string str = "Hello, World

  • js实现统计字符串中特定字符出现个数的方法

    本文实例讲述了js实现统计字符串中特定字符出现个数的方法.分享给大家供大家参考,具体如下: //js统计字符串中包含的特定字符个数 function getPlaceholderCount(strSource) { //统计字符串中包含{}或{xxXX}的个数 var thisCount = 0; strSource.replace(/\{[xX]+\}|\{\}/g, function (m, i) { //m为找到的{xx}元素.i为索引 thisCount++; }); return th

  • JS使用正则表达式除去字符串中重复字符的方法

    本文实例讲述了JS使用正则表达式除去字符串中重复字符的方法.分享给大家供大家参考,具体如下: 这里演示一个简单的JavaScript正则表达式实例,将一串含有重复字符串中的多余字符滤除掉,请运行查看效果. 具体代码如下: <html> <head> <title>利用正则表达法除去字符串中的重复字符</title> </head> <body> <script language="javascript">

  • PHP实现删除字符串中任何字符的函数

    本文实例讲述了PHP实现删除字符串中任何字符的函数.分享给大家供大家参考.具体如下: function delStr($start, $end, $orgenStr) { //读取要删除字符位置的前一部分字符串,并赋值给$temp //strpos读取字符第一次出现的位置 //substr读取指定开始与结束位置的子字符串 //echo $before."-". $last; $temp=$orgenStr; while(strpos($temp, $start) &&

  • JavaScript统计字符串中每个字符出现次数完整实例

    本文实例讲述了JavaScript统计字符串中每个字符出现次数的方法.分享给大家供大家参考,具体如下: 这是一个面试题,要求随便给你一个字符串,让你求出字符串中每个字符出现的次数. 先来看看运行效果截图: 具体代码如下: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"&

  • python实现查找两个字符串中相同字符并输出的方法

    本文实例讲述了python实现查找两个字符串中相同字符并输出的方法.分享给大家供大家参考.具体实现方法如下: seq1 = "spam" seq2 = "scam" res = [] for x in seq1: if x in seq2: res.append(x) print res 输出结果如下: ['s', 'a', 'm'] 希望本文所述对大家的Python程序设计有所帮助.

  • php获取字符串中各个字符出现次数的方法

    本文实例讲述了php获取字符串中各个字符出现次数的方法.分享给大家供大家参考.具体实现方法如下: <?php //获取字符串是哪一个字符出现的字数最多 $str = "sdfhletlsflahlajgfd;lsje;r;wj;ralajfe149253573"; //方法一 $arr = str_split($str); //字符串分隔到数组中 $arr = array_count_values($arr); //用于统计数组中所有值出现的次数,返回一个数组 //键名为原数组的

随机推荐