C++字符串常用操作(二)

目录

字符串连接操作

字符串比较操作

暴力匹配法


字符串连接操作

顾名思义,即将一个字符串链接到另一个字符串的尾部,我们可以创建一个函数,同时利用指针,分别先后全部遍历两个字符串,将其中一个字符串的结束符’\0’去除并链接另一个字符串直到遇到结束符’\0’即可,函数实现为:

#include<stdio.h>
  
char *_strcat(char dest[],char src[]){
    char * ret = dest;
    while(*dest!='\0'){dest++;}
    //将src内容复制在dest之后
    while(*src){
        *dest++ = *src++;
    }
    //在dest后面追加\0
    *dest = '\0';
    return ret;
}
  
int main(){
    char str[] = "Hello My CSDN.com";
    char fixstr[] = "Welcome ";
    _strcat(fixstr,str);
  
    printf("%s",fixstr);
  
    return 0;
}

输出Welcome Hello My CSDN.com

字符串比较操作

顾名思义,对两个字符字符字符串进行比较,常用于确认两字符串是否完全相等,部分高级用法可以扩展到利用大小差别进行容器的算法设计等,比较操作的内容就是对两个字符串进行比较,两个字符串完全相等时返回0,第一个字符串大于第二个字符串时返回一个正值,否则返回负值,实现代码为:

注意比较的时候要使用unsigned char而不要直接使用char,那是因为计算机编程语言中扩展了char的字符位,使字符位也拥有了含义,因此建议在核心的比较时使用unsigned char的类型。

#include<stdio.h>
  
int _strcmp (char  *  src, char  *  dst)   {   
    int  ret  =  0  ;   
    while(  !(ret  =  *(unsigned  char  *)src  -  *(unsigned  char  *)dst)  &&  *dst)   //两个内容相减,完全相等则会得到值 0,取反即为相等
        ++src,  ++dst;   
    if  (  ret  <  0  )   
        ret  =  -1  ;   
    else  if  (  ret  >  0  )   
        ret  =  1  ;   
    return ret;   
} 
  
int main(){
    char str[] = "Hello My DotCpp.com";
    char fixstr[] = "Welcome ";
    int ans = _strcmp(fixstr,str);
  
    printf("%d",ans);
  
    return 0;
}

输出 1

暴力匹配法

这并不是最理想的算法,但却这是字符串匹配算法中最容易理解的算法,算法核心为给定一个主串T和一个模式串P,求问是否P是属于T的一个字串,如:”Hello”中”llo”就是其中的一个字串,对于暴力匹配算法而言,我们可以利用两层循环进行比对,第一层循环中找寻T字符串中的每一个字符,第二层循环找寻的是每一个P字符,进入第二层循环时T字符串也会跟着进行字符前进,如果发生不匹配则产生一个回溯回到第一层循环的进入字符的下一个字符。

代码示例如下: 

#include<iostream>
#include<cstring>
  
using namespace std;
  
bool isBF(char str1[],char str2[]){
    bool flag=false;
    int len1 = strlen(str1);
    int len2 = strlen(str2);
    for(int i=0;i<len1;i++){
        for(int j=0;j<len2;j++){
            int pos=i;
            if( str1[pos++] != str2[j]){
                break;
            }else{
                if(j=len2-1)
                    flag=true;
            }
        }
    }
    return flag;
}
  
int main(){
    char str1[] = "HI this is my lesson.";
    char str2[] = "is";
    cout<<isBF(str1,str2)<<endl;
    return 0;
}

 输出1

综上假设字符串T的长度为n,字符串P的长度为m,则整个算法的时间复杂度为O( n * m ),而对于一个复杂的现实情况而言 n >> m >> 2 (即n远远大于m,m远远大于常数),这样的计算计算机的负担很重。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

赔罪

你的鼓励将是我最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值