1. 基本介绍

在程序设计中,字符串操作是必不可缺的,无论是工程设计还是算法设计均离不开字符串,字符串是由一个个单独的字符构成的串,其数据结构是线性的,常以ASCII码表示,同时只要设定得当,其展示任何一种编码也都是可以的。

字符串有很多的操作,也有非常多的扩展算法,本文从设计的角度介绍这些基本的字符串操作以及其实现代码,本文实现的大多数代码诸如C和C++中的头文件<string.h>(C++则是<cstring>)已经封装好了相应的函数和方法可以直接使用。

2. 获取字符串长度

顾名思义,指获取一个字符串的长度,在C语言中我们可以直接用strlen(str)来表示,其实现思路可以直接使用一个循环,对每一个字符进行计数,当循环遇到字符’\0’即结束符时循环结束,返回这个循环,示例代码如下:

#include<stdio.h>
 
int _strlen(char str[]){
    int i=0;
    for(i=0;str[i]!='\0';i++){}
    return i;
}
 
int main(){
    char *str = "Hello My DotCpp.com";
    int len = _strlen(str);
    printf("%d",len);
    return 0;
}

输出19

3. 字符位置获取

给定一个字符,获取这个字符串中首次出现这个字符的位置,如果没有找到则给与一个错误信号,如给定一个hello,要求找出l的位置,那么将会找到位置3 ,C语言中可以使用strchr(str,c)表示,实现示例代码如下:

#include<stdio.h>
 
int _charAt(char str[],char c){
    int i=0;
    for(i=0;str[i]!='\0'&&str[i]!=c;i++){}
    return i;
}
 
int main(){
    char *str = "Hello My DotCpp.com";
 
    int way = _charAt(str,'l');
    printf("%d",way);
 
    return 0;
}

输出3

扩展练习:如果需要你创建一个函数,获取这个字符串中所有出现这个字符的位置,又该如何去设计呢?

 

4. 拆分子串操作substr

顾名思义,substr对一个字符串进行拆分,也可以称之为对一个字符串的某一段进行截取,如一个字符串的长度有0~n,改操作就是取其中i~j的位置,使其重新生成一个新的字符串,获取的就是这个字符串,在C语言中没有相关的操作,在不同的教程中这样的操作也有不同的命名,本文将此操作命名未substr(在某些别的资料中substr操作则为查找操作),本实现示例代码如下(注意拆分时需要补充结束符’\0’):

#include<stdio.h>
 
char *_substr(char str[],int i,int j){
    int pos=0;
    char *backup;
    while(i<j){
        backup[pos++] = str[i++];
    }
    backup[pos]='\0';
    return backup;
}
 
int main(){
    char *str = "Hello My DotCpp.com";
 
    char *newstr = _substr(str,0,5);
 
    printf("%s",newstr);
 
    return 0;
}

输出Hello

 

5. 拆分子串操作prefix

如同上文的操作,截取操作变为了只截取字符串的前m个字符,组成一个全新的字符串,本实现示例代码如下(注意拆分时需要补充结束符’\0’):。

#include<stdio.h>
 
char *_prefix(char str[],int m){
    int pos=0,i;
    char *backup;
    for(i=0 ;i<m ;i++){
        backup[pos++] = str[i];
    }
    backup[pos]='\0';
    return backup;
}
 
int main(){
    char *str = "Hello My DotCpp.com";
 
    char *newstr = _prefix(str,5);
 
    printf("%s",newstr);
 
    return 0;
}

输出Hello

 

6. 拆分子串操作suffix

如同上文的操作,截取操作变为了只截取字符串的后m个字符,组成一个全新的字符串,本实现示例代码如下(注意拆分时需要补充结束符’\0’):

这里需要稍微注意一下,在创建字符串的时候,由于各种标准的C对语法的支持不太一样,这里采用较为旧的方式实现,即直接分配一个相应的内存空间,这与上面的做法稍微不同,如果采用char *backup的创建方式,将会产生内存错误问题,这个问题原理较为晦涩,有能力的同学可以参考资料自行理解,这里为了避免冲突简化了操作。

#include<stdio.h>
 
char *_suffix(char str[],int m){
    int len=0;
    for(;str[len]!='\0';len++){}   
    //获取字符串总长度(避免使用其他封装函数,自行设计时可以使用strlen替代)
 
    printf("%d\n",len-m);
 
    int pos=0,i;
    char backup[500];
    for(i=len-m ;i<len ;i++){
        backup[pos++] = str[i];
    }
    backup[pos]='\0';
    return backup;
}
 
int main(){
    char *str = "Hello My DotCpp.com";
 
    char *newstr = _suffix(str,3);
 
    printf("%s",newstr);
 
    return 0;
}

输出com


点赞(0)

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

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

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

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

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

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

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

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

Dotcpp在线编译      (登录可减少运行等待时间)