目录
一、前言
二、正文
1.求字符串长度
♥strlen
2.长度不受限制的字符串函数
♥strcpy
♥strcat
♥strcmp
三、结语
一、前言
一日不见,如隔三秋;几日不见,甚是想念。猜想小伙伴们在平常进行有关字符的练习时遇到有关字符的操作却无从下手,不知道该使用哪些函数来实现相应操作,虽然有些厉害的小伙伴还会写出自定义函数来实现想要的功能。为了提高小伙伴们的功底,麦麦就为大家带来库函数中常见的字符函数和字符串函数,有些函数还会进行模拟实现,供小伙伴们食用。话不多说,让我们进入正文吧!
二、正文
1.求字符串长度
♥strlen
①函数介绍
size_t strlen(const char * str);
●字符串以’\0‘作为结束标志,strlen函数返回的是在字符串中'\0'前面出现的字符个数(不包含'\0')
●参数指向的字符串必须要以’\0‘结束
●注意函数的返回值为size_t,是无符号的(易错)
●所引用的头文件“string.h”
//示例代码,帮助大家理解strlen函数的使用
#include <stdio.h>
#include <string.h>
int main()
{const char*str1="my friends";const char*str2="welcome to my blog";if(strlen(str2)-strlen(str1)>0){printf("str2>str1\n");}else if(strlen(str2)-strlen(str1)==0){printf("str2=str1\n");}else{printf("str2<str1\n");}return 0;
}
②模拟实现
在介绍完strlen函数的使用和功能后,接下来让我们来模拟实现strlen。下面为小伙伴们带来三种strlen函数的模拟实现。
①循环实现:strlen函数是计算到'\0'为止,于是我们就可以采取循环的方式,指针每移动一次,我们就让计数+1,知道指针指向’\0‘为止
②递归实现:我们发现循环实现的每一步都是一样的,那么是否可以采取递归的形式呢,答案是可以的。求"hello"的长度,就要求“ello”的长度;要求“ello”的长度,就要求“llo”的长度,这样就形成了一种递归的形式。
③指针实现:在指针那一节中我们学到了指针-指针求出的是两个指针间隔的大小。那么我们就可以用字符串末尾的'\0'的地址减去字符串首元素的地址就可以求出字符串的长度了。
具体代码如下:
#include <stdio.h>
#include <assert.h>
//strlen三种模拟实现,以下代码仅供参考size_t my_strlen_1(const char* str)
{assert(str != NULL);size_t i = 0;while (*str++){i++;}return i;
}size_t my_strlen_2(const char* str)
{assert(str != NULL);if (*str == '\0')return 0;elsereturn(1 + my_strlen_2(str + 1));
}
size_t my_strlen_3(const char* str)
{assert(str != NULL);char* tmp = str;while (*str){str++;}return(str - tmp);
}int main()
{const char* str = "hello";printf("%u\n", my_strlen_1(str)); //循环实现printf("%u\n", my_strlen_2(str)); //递归实现printf("%u\n", my_strlen_3(str)); //指针实现return 0;
}
2.长度不受限制的字符串函数
♥strcpy
①函数介绍
char* strcpy(char * destination, const char * source ) ;
●功能:将源(source)字符串拷贝到目标空间中
●源字符串必须以'\0'结束
●会将源字符串中的'\0'拷贝到目标空间
●目标空间必须足够大,以确保能存放源字符串
●目标空间必须可变
●所引用的头文件:string.h
//strcmp使用示例
#include <stdio.h>
#include <string.h>
int main()
{char arr1[20] = "";char arr2[] = "Happy new year!";strcpy(arr1, arr2);printf("%s\n", arr1);return 0;
}
②模拟实现
同样的,在小伙伴们了解完strcmp的功能和基本使用后,我们来进行strcmp的模拟实现。这个实现的逻辑是很清晰的,只需要将源字符串搬运到目标空间即可,因此我们可以采用指针以及循环的方式来实现这个功能,
具体代码如下:
//strcmp 模拟实现
#include <stdio.h>
#include <string.h>
#include <assert.h>void my_strcpy(char* dest, const char* sorc)
{assert(dest && sorc);while (*dest++ = *sorc++){;}}int main()
{char arr1[20] = "";char arr2[] = "Happy new year!";my_strcpy(arr1, arr2);printf("%s\n", arr1);return 0;
}
♥strcat
①函数介绍
char * strcat (char * destination , const char * source );
●功能:在目标空间后面追加源字符串
●源字符串必须以'\0'结尾
●目标空间必须足够大,能够容纳下源字符串的内容
●字符串不可以给自己追加
●引用的头文件:string.h
//strcat代码示例
#include <string.h>
#include <stdio.h>int main()
{char arr[20] = "hello ";char* p = "my friend";strcat(arr, p);printf("%s\n", arr);return 0;
}
②strcat模拟实现
strcat模拟实现的思路:⑴找到目标指针的'/0'【指针加循环】
⑵将源字符串追加到目标指针的后面【可采用拷贝字符串的方法】
//模拟实现strcat
#include <stdio.h>
#include <string.h>
#include <assert.h>
char* my_strcat(char* dest, const char* sorc)
{assert(dest && sorc);char* ret = dest;while (*dest){dest++;}while (*dest++ = *sorc++){;}return ret;
}int main()
{char arr[20] = "hello ";char* p = "my friend";my_strcat(arr, p);printf("%s\n", arr);return 0;
}
♥strcmp
①函数介绍:
int strcmp(const char* str1,const char * str2);
● 功能:比较两个字符串的大小,从第一个字符开始,直到比出大小【ASCALL值】
eg:"abc"小于"bcd"——a的值小于b
●标准规定:
○第一个字符串大于第二个字符串,则返回大于0的数字
○第一个字符串等于第二个字符串,则返回0
○第一个字符串小于第二个字符串,则返回小于0的数字
//strcmp使用示例
//注:VS环境下,strcmp的返回值为:1、0、-1
#include <stdio.h>
#include <string.h>
int main()
{char arr1[] = "abq";char arr2[] = "abcdef";int ret1 = strcmp(arr1, arr2);int ret3 = strcmp(arr2, arr1);int ret2 = strcmp(arr1, arr1);printf("%d\n", ret1);printf("%d\n", ret2);printf("%d\n", ret3);return 0;
}
②模拟实现
模拟实现strcmp思路:⑴两个字符串一一比较【指针+循环】
⑵循环若跳出则依据指针内容判断字符串大小
//strcmp 模拟实现
#include <string.h>
#include <stdio.h>
#include <assert.h>
int my_strcmp(const char* str1, const char* str2)
{assert(str1 && str2);while (*str1 && *str2){if (*str1 > *str2)return 1;if(*str1 < *str2)return -1;str1++;str2++;}if (*str1 == '\0' && *str2=='\0')return 0;else if(*str2=='\0')return 1;if (*str1 == '\0')return - 1;
}
int main()
{char arr1[] = "abq";char arr2[] = "abcdef";int ret1 = my_strcmp(arr1, arr2);int ret3 = my_strcmp(arr2, arr1);int ret2 = my_strcmp(arr1, arr1);printf("%d\n", ret1);printf("%d\n", ret2);printf("%d\n", ret3);return 0;
}
三、结语
干货满满,有码有图,写文不易,看完的小伙伴们不要忘记动动手指点点赞,走个关注,三连互访!!!