C++ 删除字符串的两种实现方式

C++实现删除给定字符串的给定字符串思路主要有这么几种实现方式:

1.KMP算法
2.用STL的string的 find,然后用erase
3.用C的strstr找到字串位置,然后用strncpy写到新串中
4.用boost库,用正则表达式

测试过的完整代码:

第一种方法:

#include<iostream>
#include <string>
using namespace std;

void deletestr(const char *str, const char* sub_str, char *result);

int main()
{
	char str[100],sub[100];
	cin>>str;
	cin>>sub;
	char result;
	deletestr(str,sub,&result);
	return 0;
}

void deletestr(const char *str, const char* sub_str, char *result)
{
    int sublen = 0;         //获得子串的长度
    const char *t = sub_str;
    while(*t++ != ‘\0‘)
    {
        sublen++;
    }

    int pos = 0;
    int pp = 0;
    int repos = 0; // 结果子串的索引
    while(*(str + pos) != ‘\0‘)
    {
        char t = *(str + pos);
        if(t == *(sub_str + pp)) // 重复子串起始位置
        {
            *(result + repos) = t;
            repos++;

            if(pp < sublen - 1) // 还未完全重复
            {
                pp++;
            }
            else if(pp == sublen - 1) // 完全重复了
            {
                pp = 0;
                repos -= sublen; // 回溯下标位置
            }
        }
        else{ // 不是一样的字符
            *(result + repos) = t;
            repos++;
        }
        pos++;
    }
    *(result + repos) = ‘\0‘;
	cout<<result<<endl;
}

第二种方法,用STL

个人感觉很简单方便

#include<iostream>
#include <string>
using namespace std;

void deletesub(string &str,const string &sub,int n);
int main()
{
	string str,sub;
	cin>>str;
	cin>>sub;
	int n=sub.size();
	deletesub(str,sub,n);
	return 0;
}
void deletesub(string &str,const string &sub,int n)
{
	int m,flag=0,num=0;           //num是子串出现的次数
   while(flag==0)
   {
		m=str.find(sub);
		if(m<0)
			flag=1;
		else
		{
		  str.erase(m,n);           //删除子串
		  num++;
		}
   }
//	cout<<num<<endl;          //子串出现的次数
	cout<<str<<endl;         // 输出删除后的字符串
}
时间: 2024-08-26 14:54:40

C++ 删除字符串的两种实现方式的相关文章

OC--定义字符串的两种方式

1.常量区 存放一些常量字符串2.堆 对象3.栈 存放局部变量 掌握:1.定义字符串的两种方式 1>利用数组 char name[] = "itcast"; 特点:字符串里面的字符是可以修改的 2>利用指针 char *name = "itcast"; 特点:字符串其实是一个常量字符串,里面的字符是不能修改的

定义字符串的两种方式

定义字符串的两种方式 数组定义 char name[] = "answer" 指针定义 char *name = "answer" 比较 字符串里的字符可以修改,而字符串是一个常量,字符串里面的字符不能修改. >Tips:可以与我的另外一篇文章一起看.http://blog.csdn.net/u011192270/article/details/46475981 版权声明:本文为博主原创文章,未经博主允许不得转载.

添加节点、删除节点的两种方式

添加节点.删除节点的两种方式:(1)一种是静态添加修改slaves文件,重启hadoop集群优点:改动少缺点:暴力 需要停止服务应用环境:晚上或凌晨做 不耽误使用检查:50070和8088端口检查(50070hdfs系统的web地址,8088yarn的外部端口)(2)一种是动态添加:修改slaves文件,不重启hadoop集群新建主机列表文件优点:非暴力 不需要停止服务缺点:改动多 如果一次上很多 会乱应用环境:随时不耽误使用检查:50070和8088端口检查 原文地址:https://www.

C语言中存储多个字符串的两种方式

C语言中存储多个字符串的两种方式 方式一    二维字符串数组 声明: char name[4][10] = { "Justinian", "Momo", "Becky", "Bush" }; 在内存中的存储: J u s t i n i a n \0 M o m o \0 \0 \0 \0 \0 \0 B e c k y \0 \0 \0 \0 \0 B u s h \0 \0 \0 \0 \0 \0 这种方式会造成内存空间

二、C++迭代器的两种实现方式 (Range for和C#、Java中的foreach)

一.迭代器概述 这个标题其实有点"标题党"的含义,因为C++在标准库中的实现迭代器的方式只有一种,也就是为类定义begin()和end()函数,C++11增加了range for语句,可以用来遍历迭代器中的元素.实现迭代器的第二种方式,就是用C++模拟C#和Java中的迭代器模式,并且我们可以定义出自己的foreach语句.除此之外,迭代器可能还有很多种实现的方法,各个库也会多自己的迭代器的实现有所定义,在这里只要明白迭代器的本质意义即可. 迭代器,也称作游标,是一种设计模式,我们可以

PlaceHolder的两种实现方式

placeholder属性是HTML5 中为input添加的.在input上提供一个占位符,文字形式展示输入字段预期值的提示信息(hint),该字段会在输入为空时显示. 如 1 <input type="text" name="loginName" placeholder="邮箱/手机号/QQ号"> 目前浏览器的支持情况 浏览器 IE6/7/8/9 IE10+ Firefox Chrome Safari  是否支持 NO YES YE

Redis两种持久化方式(RDB&amp;AOF)

爬虫和转载请注明原文地址;博客园蜗牛:http://www.cnblogs.com/tdws/p/5754706.html Redis所需内存 超过可用内存怎么办 Redis修改数据多线程并发—Redis并发锁 windows下redis基础操作与主从复制 从而 数据备份和读写分离 Redis两种持久化方式(RDB&AOF) Redis的持久化过程中并不需要我们开发人员过多的参与,我们要做的是什么呢?除了深入了解RDB和AOF的作用原理,剩下的就是根据实际情况来制定合适的策略了,再复杂一点,也就

两种出错处理方式

两种出错处理方式:一种是对出错函数进行重定义,一种是对错误进行捕捉处理. ;;=================================================================================================== ;;=================================================================================================== ;;=======

Android中两种序列化方式的比较Serializable和Parcelable

Serializable和Parcelable接口可以完成对象的序列化过程,当我们需要通过Intent和Binder传输数据时就需要使用者两种序列化方式.还有,我们需要对象持久化到存储设备或者通过网络传输给其他客户端,这个使用也需要使用Serializale来完成对象的序列化.在Android应用开发中,这两种方式都很常见,但两者方式并不相同. 1.Serializable接口 Serializable接口是Java提供的一个序列化接口,它是一个空接口,为对象提供标准的序列化和反序列化操作.使用