//sub_before为str中sub所在位置的之前部分
//sub_after为str中sub所在位置的之后部分,包括sub
void str_split(const char* str/*in*/,char* sub/*in*/,char** sub_before/*out*/,char** sub_after/*out*/){
if ( str == NULL || *str=='\0' || sub==NULL){
printf("function str_split error:( str == NULL || *str=='\0' || sub==NULL)");
return;
if (*sub_before == NULL){
*sub_before = (char*)malloc(strlen(str));
if (*sub_after == NULL){
*sub_after = (char*)malloc(strlen(str));
//分割字符串的时候使用strstr函数,返回是第一个sub地址,如果没有匹配的则返回NULL
char* temp = (char*)malloc(strlen(str));
strcpy(temp,str);
*sub_after = strstr(temp, sub);
//没有匹配的子串
if (*sub_after == NULL || **sub_after == '\0'){
printf("the str without sub");
return;
//添加结束标志符
*(*sub_after + strlen(*sub_after)) = '\0';
//将字符串中sub之前的字符赋值给sub_before
int i = 0;
while (i < (strlen(temp)-strlen(*sub_after))){
*(*sub_before + i) = *(temp+i);
//添加结束标志符,添加结束标志的目的是为了防止乱码
*(*sub_before + i) = '\0';
二、去字符串的前后空格
//传入一个字符串,去除字符串前后的空格
//参数:
//str为需要去除空格的字符串
//newchar为去除空格之后的字符串
void trim_space(const char* str/*in*/,char* newchar/*out*/){
if (str == NULL || *str == '\0' || newchar == NULL){
printf("function trim_space error:(str==NULL || *str=='\0' || newchar == NULL)");
return;
//利用左右开弓来去除前后的空格
int i = 0, j = strlen(str);
//isspace函数是用来判断字符是否为空格
//求出,在str字符串前面有多少个空格
while (isspace(str[i]) || str[i]=='\0')
//求出,在str字符串后面有多少个空格
while (isspace(str[j]) || str[j]=='\0'){
//从str+i个位置开始将(j-i+1)个字符拷贝到newchar中
strncpy(newchar,str+i,j-i+1);
三、递归实现字符串的反转
//通过函数的递归调用来实现字符串的反转
//参数:
//str:需要反转的字符串
//inverse_str:反转之后的字符串
void str_inverse(const char* str/*in*/,char* inverse_str/*out*/){
//遇到异常情况,直接跳出方法
if (str == NULL || inverse_str==NULL){
printf("function str_inverse error:(str == NULL || inverse_str==NULL)");
return;
//递归的结束,当到str字符串结束的时候
if (*str == '\0'){
return;
str_inverse(str+1,inverse_str);
strncat(inverse_str,str,1);
void main(){//调用字符串反转
char* s = "abcdefg";
//char result[10] = {0};//这种方式可以调用成功
//char* result = (char*)malloc(strlen(s));//这种会宕机(出现异常),原因是因为malloc函数不会初始化导致,因为开辟空间的时候只开辟了
//那么多,而后面使用strcat函数进行拼接,是直接在以前的基础上进行拼接,会出现,前面乱码,但是结果还是正确的
char* result = (char*)calloc(strlen(s),1);
str_inverse(s,result);
cout << result << endl;
四、字符串的替换(下面的函数使用到了上面的字符串分割函数str_split)
//字符串的替换
//参数:
//str:原字符串
//replace_str:要被替换的字符串
//replace_become:要替换成什么字符串
//replace_after:替换之后的字符串
void str_replace(const char* str/*in*/,char* replace_str/*in*/,char* replace_become/*in*/,char** replace_after/*out*/){
//遇到异常情况直接退出
if (str == NULL || *str == '\0' || replace_str == NULL || replace_str == '\0' || replace_become == NULL || *replace_become=='\0'){
printf("function str_replace error:(str==NULL || *str =='\0' || replace_str==NULL || replace_str=='\0')");
return;
const char* flag = strstr(str,replace_str);
//字符串str中没有子串
if (flag==NULL){
printf("the str without replace_str");
return;
//为结果开辟空间
*replace_after = (char*)calloc(strlen(str)+strlen(replace_become)-strlen(replace_str),1);
//通过字符串的分割之后进行拼接
char *after = NULL, *before=NULL;
while (flag){
if (after == NULL){
str_split(str, replace_str, &before, &after);
else{
str_split(after, replace_str, &before, &after);
strcat(*replace_after,before);
strcat(*replace_after,replace_become);
after = after + strlen(replace_str);
flag = strstr(after,replace_str);
if (after != '\0'){
strcat(*replace_after,after);
要想掌握好c语言中的指针,多做一下c语言中的字符串操作是最好的办法。
可以看到,截断字符串后,它的长度缩短了,因为'\0'字符之后的字符不会被打印。除此之外,我们还可以注意到,字符串中的空格字符不会影响字符串的长度或者截断操作。总之,在C语言中,字符串中的空格和'\0'字符是不同的,空格字符只是字符串中的普通字符,而'\0'字符则表示字符串的结尾,同时它还是空字符。需要特别注意的是,当我们使用字符串相关的函数进行操作时,要考虑到结尾的'\0'字符。这个'\0'字符会告诉C语言字符串的结尾,同时也是空字符,如果字符串中有'\0'字符,那么它将作为字符串的截止标志。
在一些编程练习中,经常会对字符串进行处理,往往处理之前都会对字符串进行分割来提取各部分信息。在C++中虽然没有像python那样提供split这样直接的字符串分割函数,但也有一些其他的方法能够对其进行分割,下面介绍几种C++中常用的字符串分割方法。
通过string成员函数实现
在C++ string类中,提供了两个成员函数可以用来实现字符串分割,一个是find函数,另一个是substr函数,下面看一下这两个函数的声明。find函数:
原型: size_t find (const string&
1、头文件:#include <string.h>
2、定义函数:char * strtok(char *s, const char *delim);
分解字符串为一组字符串。s为要分解的字符,delim为分隔符字符(如果传入字符串,则传入的字符串中每个字符均为分割符)。
3、函数说明:
strtok()用来将字符串分割成一个个片段。参数s 指向欲分解的字符串,参数delim 则为分隔字符串;
当strtok()在参数s 的字符串中发现到参数delim 的分割字符时则会将该字符改为...
一、利用strtok()函数进行分割
函数头文件#iinclude<string.h>
函数原型:char *strtok(char s[], const char *delim);s[]是原字符串,delim为分隔符
返回:字符串拆分后的首地址。 “拆分”:将分割字符用 '\0’替换
1)strtok拆分字符串是直接在 原串 上操作,所以要求参1必须,可读可写(char *str = “www.baidu.com” 不行!!!)
2)第一次拆分,参1 传待拆分的原串。 第1+ 次拆分时
1、split:将一个字符串分割为子字符串,然后将结果作为字符串数组返回。
2、indexOf() :返回某个指定的字符串值在字符串中首次出现的位置(从左向右)。没有匹配的则返回-1,否则返回首次出现位置的字符串的下标值。
3、substr(start,length):表示从start位置开始,截取length长度的字符串。
4、substring(start,end):表示从start到end之间的字符串,包括start位置的字符但是不包括end位置的字符。
5、lastIndexOf()方法返回
找工作,面临着要笔试,而编程题的一些小的函数有时候又很需要,平时简单记一下小的函数,以后用到,直接复制粘贴就行。将字符串按照某个字符分割成若干个字符串,如"a,b,bbbb,ccc"按照‘,’分割成“a”、“b”、“bbbb”、“ccc”如“:a:b:d:”按照‘:’分割成 “空”“a”、“b”、“d”、“空”(注意,冒号在两端,所以有空)vector<string> split(co...
2、案例讲解
1、Strtok()函数详解: 该函数包含在"string.h"头文件中
1) 函数原型: char* strtok (char* str,constchar* delimiters );
2) 函数功能: 切割字符串,将str切分成一个个子串
3) 函数参数:
str:在第一次被调用的时间str是传入需要被切割字符串的首地址;在后面调用的时间传入NULL。
delimiters:表示切割字符串(字符串中每个字符都会 当作分