目录

  • 前言
  • strlen函数
    • strlen
    • sizeof
  • strcpy函数
  • strcat函数
  • strcmp函数
  • 总结

前言

最近要调整状态,写的文章质量不佳让大家失望,我现在也在反思我在做什么,我会什么,我学了什么。等我想明白的那天,我一定能跟大家顶峰相见的,也祝大家低头赶路,敬事如仪。

我也在这用基普乔格的一句话感谢大家的支持:” No human is limited.”,最后回到正题 我们今天讲的是c语言缺少的一部分东西,库里的函数,这里面的函数可大有来头,听我娓娓道来。

strlen函数

你虽然看这函数这么点单词,肯定不高级,欸,这函数还真是不得了了,这函数大有来头,听我一一分析,听完你知乎内涵呀

size_t strlen ( const char * str );

可知这代码结构式虽然这么简单,但在不管是做题,工作中,这代码的重要程度仅此于sizeof。所以我们引出第一个话题 跟sizeof的区别

strlen

strlen作为一个库函数,他作用于字符串已经 ‘\0’ 作为结束标志,strlen函数返回的是在字符串中 ‘\0’ 前面出现的字符个数(不包含 ‘\0’ )。又有人问了 啥意思,说话能解决的事情要代码干嘛,代码展示:

#include #include int main(){    char str[100] = { 0 };    size_t len;    gets(str);    len = strlen(str);    printf("Length: %d\n", len);    return 0;}


其实根据我们也能发现 strlen是根据\0的位置找出前面字符的个数。这就是strlen中的最重要的最用,其实不管是在oj题中还是练习题,strlen能最快帮我们定位到一个数组最后的一个元素,更好去使用。

#include #include #include  void reverse(char* left, char* right)   //逆序字符串(整个字符串的逆序){assert(left != NULL && right != NULL);while (left < right){int ret = *left;*left = *right;*right = ret;left += 1;right -= 1;}} int main(){char arr[100] = { 0 };gets(arr);int len = strlen(arr);reverse(arr, arr + len - 1);printf("%s", arr);return 0;}

就也是最简单最暴力的逆序排序了。
用到strlen找到最后一个元素。
最后要一下strlen函数的返回类型是size_t – 无符号整型

sizeof

首先注意的是sizeof更重要的在于他不是个函数,而是一个操作符。
sizeof操作符以字节形式给出了其操作数的存储大小。操作数可以是一个表达式或括在括号内的类型名。操作数的存储大小由操作数的类型决定。
其实简单来说 记录就是字符串的所占空间,可以说跟strlen打不到一边
但为什么总是于strlen弄混(本人也弄混),其实最主要的是对两个的用法含义不太理解。但是看了我这一部分你会懂了很多的

sizeof使用形式: sizeof(type)
  数据类型必须用括号括住: sizeof(int)

int a=10;int arr[]={1,2,3};char str[]="hello";int len_a = sizeof(a);int len_arr = sizeof(arr);int len_str = sizeof(str);printf("len_a=%d,len_arr=%d,len_str=%d\n",len_a,len_arr,len_str);

计算了每个不同类型的所占空间

strcpy函数

Copies the C string pointed by source into the array pointed by destination, including theter minating null character (and stopping at that point)
我们翻译一遍就是拷贝功能,那他有啥功能让我把英文都列举出来了。

char *strcpy(char *dest, const char *src)

简单来看一下,我们会发现每个字符串都有一个‘\0’,我们进行猜想 为啥拷贝完结束了,会不会也把‘\0’拷贝进去了,我们上机模拟

int main(){char str1[] = "Sample string";char str2[40];char str3[40];strcpy(str2, str1);strcpy(str3, "copy successful");printf("str1: %s\nstr2: %s\nstr3: %s\n", str1, str2, str3);return 0;}


其实我们也发现strcpy还是把‘\0’传过去了,所以strcpy有以下规则

  1. 源字符串必须以 ‘\0’ 结束。
  2. 会将源字符串中的 ‘\0’ 拷贝到目标空间。
  3. 目标空间必须足够大,以确保能存放源字符串

我们知道以下规则 那我们去创作一个自己的strcpy函数

#include //返回的是目标空间的起始地址char* my_strcpy(char* dest, const char*src){char* ret = dest;assert(dest && src);while (*dest++ = *src++){;}return ret;}int main(){char arr1[] = "hehe";char arr2[20] = { 0 };//my_strcpy(arr2, arr1);//printf("%s\n", arr2);printf("%s\n", my_strcpy(arr2, arr1));return 0;}

通过使用欸,跟原本函数不一样,我们就知道了这可能就是strpy函数的源码了。
学到这,你其实就发现其实这些函数都是程序都是程序员模拟的。

strcat函数

这个函数可能很多人没见过,那会不多说 我放英文原意

Copies the first num characters of source to destination. If the end
of the source C string (which is signaled by a null-character) is
found before num characters have been copied, destination is padded
with zeros until a total of num characters have been written to it

原意就是 在后面字符串中往后添加后面的数组的内容

char * strcat ( char * destination, const char * source );
在这int main(){char arr1[20] = "hello \0xxxxxxxxx";char arr2[] = "world";//追加strcat(arr1, arr2);printf("%s\n", arr1);return 0;}

我通过运行也发现得出结果是hello world

源字符串必须以 ‘\0’ 结束。
目标空间必须有足够的大,能容纳下源字符串的内容。
目标空间必须可修改

那如果是自己给自己追加呢,上代码

int main(){char arr2[] = "world";//追加strcat(arr2, arr2);printf("%s\n", arr2);return 0;}

我们会发现 这个代码一直在循环,下面也是我画的图,根据图你会发现‘\0’被原本覆盖了。


我们知道了规则,写出一串代码就变了容易很多
自作代码:

#includechar* my_strcat(char* dest, const char*src){assert(dest && src);char* ret = dest;//找目标空间中的\0while (*dest != '\0'){dest++;}//拷贝while (*dest++ = *src++){;}return ret;}int main(){char arr1[20] = "bit";my_strcat(arr1, arr1);printf("%s\n", arr1);//char arr1[20] = "hello ";//char arr2[] = "world";//追加//my_strcat(arr1, arr2);//printf("%s\n", arr1);return 0;}

这是代码的形成,通过这个代码更能分析出strcat的规则。

strcmp函数

这个函数是str+cmp组成的,欸,我们要警觉了,但我们还是要猜想是不是一个比较两个数组的函数,那我们就看下

This function starts comparing the first character of each string. If
they are equal to each other, it continues with the following pairs
until the characters differ or until a terminating null-character is
reached.

我们会发现这就是一个比较两数组的函数,我们用代码测试一下他的规则

int main(){//char* p = "abcdef";比较2个字符串的内容的时候,不能使用==,应该使用strcmp//if ("abcdef" == "bbcdef")//这里比较的是连个字符串首字符的地址,而并不是字符串的内容//{//}char arr1[] = "abq";char arr2[] = "abq";char arr3[] = "abc";char arr4[] = "abz";int ret = strcmp(arr1, arr2);int ret1 = strcmp(arr1, arr3);int ret2 = strcmp(arr1, arr4);printf("%d\n", ret);printf("%d\n", ret1);printf("%d\n", ret2);return 0;}


所以我们发现以下规则:

标准规定:
第一个字符串大于第二个字符串,则返回大于0的数字
第一个字符串等于第二个字符串,则返回0
第一个字符串小于第二个字符串,则返回小于0的数字

就是一个一个字母比较 ,如果相同则跳过,直到比较到一个ascII不相同的字符,则停下,显示屏输出返回值。
知道一下规则,我们模拟此函数

#include int my_strcmp(const char* str1, const char* str2){assert(str1 && str2);while (*str1 == *str2) {if (*str1 == '\0')return 0;str1++;str2++;}return *str1 - *str2;//if (*str1 > *str2)//return 1;//else//return -1;}int main(){char arr1[] = "abzqw";char arr2[] = "abq";/*int ret = my_strcmp(arr1, arr2);printf("%d\n", ret);*/if (strcmp(arr1, arr2) >0)printf(">\n");return 0;}

通过一个一个指针指向的函数进行比较,使的比较更简单。这也是学习的意义呀。

总结

写文章其实对于我来说就是放松。面对严峻的考试,痛苦的会议,学校的压力。
唯有写文章可以放松自我,提升自我,让自己有更好的理解,而我是一个喜欢分享生活,享受生活的人,有生活烦恼来找我,有故事来找我,有酒,私信必回。
最后也祝所有看我的文章的人,生意顺利,没有任何烦恼,幸福走下后面的路。


用林俊杰的话作为结尾:输了你赢了世界又如何。加油各位