目录
- 前言
- strlen函数
- strlen
- sizeof
- strcpy函数
- strcat函数
- strcmp函数
- 总结
前言
最近要调整状态,写的文章质量不佳让大家失望,我现在也在反思我在做什么,我会什么,我学了什么。等我想明白的那天,我一定能跟大家顶峰相见的,也祝大家低头赶路,敬事如仪。
我也在这用基普乔格的一句话感谢大家的支持:" No human is limited.",最后回到正题 我们今天讲的是c语言缺少的一部分东西,<string.h>库里的函数,这里面的函数可大有来头,听我娓娓道来。
strlen函数
你虽然看这函数这么点单词,肯定不高级,欸,这函数还真是不得了了,这函数大有来头,听我一一分析,听完你知乎内涵呀
size_t strlen ( const char * str );
可知这代码结构式虽然这么简单,但在不管是做题,工作中,这代码的重要程度仅此于sizeof。所以我们引出第一个话题 跟sizeof的区别
strlen
strlen作为一个库函数,他作用于字符串已经 ‘\0’ 作为结束标志,strlen函数返回的是在字符串中 ‘\0’ 前面出现的字符个数(不包含 ‘\0’ )。又有人问了 啥意思,说话能解决的事情要代码干嘛,代码展示:
#include <stdio.h>
#include <string.h>
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 <stdio.h>
#include <string.h>
#include <assert.h>
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有以下规则
- 源字符串必须以 ‘\0’ 结束。
- 会将源字符串中的 ‘\0’ 拷贝到目标空间。
- 目标空间必须足够大,以确保能存放源字符串
我们知道以下规则 那我们去创作一个自己的strcpy函数
#include <assert.h>
//返回的是目标空间的起始地址
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’被原本覆盖了。
我们知道了规则,写出一串代码就变了容易很多
自作代码:
#include<assert.h>
char* my_strcat(char* dest, const char*src)
{
assert(dest && src);
char* ret = dest;
//找目标空间中的\0
while (*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 <stdio.h>
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;
}
通过一个一个指针指向的函数进行比较,使的比较更简单。这也是学习的意义呀。
总结
写文章其实对于我来说就是放松。面对严峻的考试,痛苦的会议,学校的压力。
唯有写文章可以放松自我,提升自我,让自己有更好的理解,而我是一个喜欢分享生活,享受生活的人,有生活烦恼来找我,有故事来找我,有酒,私信必回。
最后也祝所有看我的文章的人,生意顺利,没有任何烦恼,幸福走下后面的路。
用林俊杰的话作为结尾:输了你赢了世界又如何。加油各位