Dotcpp  >  编程教程  >  串、数组、矩阵和广义表  >  C++字符串常用操作(二)

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

点击打开在线编译器,边学边练

1.字符串连接操作

顾名思义,即将一个字符串链接到另一个字符串的尾部,我们可以创建一个函数,同时利用指针,分别先后全部遍历两个字符串,将其中一个字符串的结束符’\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 DotCpp.com";
    char fixstr[] = "Welcome ";
    _strcat(fixstr,str);
 
    printf("%s",fixstr);
 
    return 0;
}

输出Welcome Hello My DotCpp.com


2. 字符串比较操作

顾名思义,对两个字符字符字符串进行比较,常用于确认两字符串是否完全相等,部分高级用法可以扩展到利用大小差别进行容器的算法设计等,比较操作的内容就是对两个字符串进行比较,两个字符串完全相等时返回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


3. 暴力匹配法

这并不是最理想的算法,但却这是字符串匹配算法中最容易理解的算法,算法核心为给定一个主串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远远大于常数),这样的计算计算机的负担很重。



本文固定URL:https://www.dotcpp.com/course/125

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

数据结构教程
第一章 数据结构入门
第二章 链表
第三章 栈
第四章 队列
第五章 C++STL库教程(附带题库)
第六章 串、数组、矩阵和广义表
第七章 树
第八章 图
第九章 查找算法
第十章 排序算法
第十一章 算法和竞赛
第十二章 后记
Dotcpp在线编译      (登录可减少运行等待时间)