博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C++ 删除字符串的两种实现方式
阅读量:5294 次
发布时间:2019-06-14

本文共 1715 字,大约阅读时间需要 5 分钟。

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

1.KMP算法

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

 

测试过的完整代码:

第一种方法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
#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

个人感觉很简单方便

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#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;         
// 输出删除后的字符串  
}

转载于:https://www.cnblogs.com/wangjian8888/p/8618307.html

你可能感兴趣的文章
高德地图 – 1.问题集锦
查看>>
[转载]网络流笔记
查看>>
ES6学习之let声明变量的学习
查看>>
Java包装类型
查看>>
SQL学习笔记第3次
查看>>
如何理解封装、继承和多态
查看>>
vim 文档加密
查看>>
java EE,java Web中的400,404,405等各种错误介绍
查看>>
MySQL max_allowed_packet设置及问题
查看>>
A Xamarin.Forms Infinite Scrolling ListView
查看>>
MapReduce入门(三)倒排索引
查看>>
android 几个开源项目
查看>>
jsmooth和exe4j
查看>>
写给后端程序员的HTTP缓存原理介绍
查看>>
phonegap开发环境搭建
查看>>
在线学习站点
查看>>
销售价目表加业务区域字段
查看>>
hdu 1528 二分匹配
查看>>
hdu 1863
查看>>
Ubuntu16.04中安装stlink驱动
查看>>