前言
C语言中对字符和字符串的处理很是频繁,但是C语言本身是没有字符串类型的,字符串通常放在
常量字符串中或者字符数组中。
其中字符串常量 适用于那些对它不做修改的字符串函数
- 我们先来通过一个思维导图简单认识一下这些字符/字符串函数
- 好了,我们来一个一个介绍一下!
一.求字符串长度的函数strlen
size_t strlen ( const char * str );
- 1.我们知道字符串以 ‘\0’ 作为结束标志,而strlen函数返回的是在字符串中 ‘\0’ 前面出现的字符个数(不包含 ‘\0’ )。
- 2.参数指向的字符串必须要以 ‘\0’ 结束。
- 比如以下的字符串,strlen是无法计算其长度的
char arr[10]={'a','b','c'}//没有\0作为结束标志
- 注意:函数的返回值为size_t,是无符号的( 易错 )
我们来看下面这个例子
#include <string.h> #include <string.h> int main() { if (strlen("abc") - strlen("abcdef") > 0) { printf("大于\n"); } else { printf("小于等于\n"); } return 0; }
- 很多初学者往往遇到类似的程序时感到疑惑,我们显而易见的是"abc"一定是小于"abcdef"的,那么为什么我们的编译器判断的是大于呢?
- 请看这里,
size_t strlen ( const char * str );
- 如果我们想让该程序运行正确,这样修改即可
if ((int)strlen("abc") - (int)strlen("abcdef") > 0)
- 但是,这里又有一定的不合理性,我们知道计算一个字符串的长度,返回的一定是一个大于0的数也就是无符号数(这也是在库函数中把strlen返回值设为size_t的原因),但是这里的int是一个有符号数。
- 总的来说,两者都有利有弊,在我们实际应用时根据需要选择返回值类型即可
1.模拟实现strlen函数
普通方法比较简单,想学的可以自己试试,我这里带来两种比较高大上的方法带大家实现strlen函数,当然如果这两种方法你弄懂了,普通方法随便写就能实现
用递归法实现strlen函数
//递归的形式实现 int my_strlen(char* arr) { if (*arr) return 1 + my_strlen(arr+1);//每递归一次+1,直至*arr指向\0 } int main() { char arr[] = "abcdefgh"; int ret = my_strlen(arr); printf("%d", ret); return 0; }
指针-指针的方法实现
//指针-指针的形式 int my_strlen(char*arr) { char* p1 = arr; while (*p1) { p1++; } return p1 - arr;//通过最后一个元素减去首元素得到字符串大小 } int main() { char arr[] = "abcdefgh"; int ret = my_strlen(arr); printf("%d", ret); return 0; }
- 是不是很简单呢?我们继续
二.拷贝函数strcpy
char* strcpy(char * destination, const char * source );
其中传入的两个参数,第一个参数为目的地地址,第二个参数为源头地址,我们strcpy函数的目的是把源头地址中的字符串拷贝到目的地地址中去。
其中,源字符串必须以 ‘\0’ 结束。
strcpy会将源字符串中的 ‘\0’ 拷贝到目标空间。
目标空间必须足够大,以确保能存放源字符串。
目标空间必须可变。
#include<string.h> int main() { char arr1[] = { "Hello,World" }; char arr2[20] = { 0 };//此处目的地中初始化必须指定空间大小 strcpy(arr2, arr1); printf("%s", arr2); return 0; }
模拟实现strcpy函数
#include<assert.h> void my_strcpy(char* p1, const char* p2) { assert(p1 && p2);//先断言保证p1,p2都不是空指针 while (*p1 = *p2)//把源头元素赋给目的地,直至遇到\0; { p1++; p2++; } } int main() { char arr1[] = { "Hello,World" }; char arr2[20] = { 0 }; my_strcpy(arr2, arr1); printf("%s", arr2); return 0; }
- 是不是也不算很难?那我们继续!
三.比较字符串大小函数strcmp
int strcmp ( const char * str1, const char * str2 );
- 那么在C语言中是如何比较字符串大小的呢?
1.字符串比较大小规则
- 对于两个字符串比较大小,其实就是比较对应位置字符ASCLL码值的大小,如果相同位置的ASCLL值相同,就比较下一个位置,直到出现不同为止。
- 比如以下的代码
- 我们知道’z’的ascll码值比’l’大,因此返回大于0的数。strcmp函数的比较逻辑是一旦比较的两个字符串相同位置元素出现差异时,strcmp就会停止并返回值
- 注意:这里返回的1并不代表大于一定返回1,而会根据编译器的不同而有所不同,这里千万不要理解成一定返回1
2.模拟实现strcmp函数
#include<string.h> #include<assert.h> int my_strcmp(const char* p1, const char* p2) { assert(p1 && p2); while (*p1 == *p2) { if (*p1=='\0')//当走到\0时发现两者依旧相等,说明两者是真的相等 return 0; p1++; p2++; } return *p1 - *p2;//返回值大于0,p1>p2,返回值小于0,p1<p2 } int main() { char arr1[10] = "zhangsan"; char arr2[10] = "zhangsan"; int ret =my_strcmp(arr1, arr2); printf("%d", ret); return 0; }
总结
- 今天的内容到这里就结束了,我们今天先介绍了三个函数strlen,strcpy和strcmp并分别模拟实现了这三个函数,如果可以的话,希望你也能自己动手实操一下,这样往往能让你有一个更深的理解。
- 好了,如果你有任何疑问欢迎在评论区或者私信我提出,大家下次再见啦!