本文重点
- 1.strlen
- 2.strcpy
- 3.strcat
- 4.strcmp
💜在本专题内 将重点介绍:
⭐️字符函数
⭐️字符串函数
⭐️内存函数
这些库函数的使用和注意事项。
这些注意事项有些看似是很不起眼,但是我们必须充分了解以便自己能模拟实现。
所以在看注意事项时,一是要在未来使用时多注意,二是要思考对应需求如何用代码实现。
有:
🍎求字符串长度的函数
1.strlen
🍎长度不受限制的字符串函数
1.strcpy
2.strcat
3.strcmp
🍎长度受限制的的字符串函数
1.strncpy
2.strncat
3.strncmp
引:
C语言中对字符和字符串的处理很是频繁,但是C语言本身没有字符串类型,字符串通常放在
常量字符串
和字符数组
中。
正文开始@边通书
学习这块内容,要勤查阅此网站:
点击直达http://www.cplusplus.com/
1.strlen
下面将围绕这几点详细展开:
🍇strlen函数用来计算字符串长度,返回的是
\0
之前出现字符个数
🍇参数指向字符串必须以\0
结束
🍇函数的返回值类型为size_t
,即无符号整型(易错)
😇学会strlen的模拟实现(三种方法:1.计数器 2.指针-指针 3.递归 —不创建任何临时变量实现求字符串长度
)
🍇strlen函数返回的是无符号整型:
典例:
问输出结果?
#include <stdio.h>
#include <sting.h>
int main()
{
const char*str1 = "abcdef";
const char*str2 = "bbb";
if (strlen(str2) - strlen(str1)>0)
{
printf("hehe\n");
}
else
{
printf("haha\n");
}
return 0;
}
🍇参数指向字符串必须以\0
结束
😇
strlen
的模拟实现—my_strlen
(三种方式)
🐟 计数器
🐟 指针 - 指针
🐟 递归(不创建临时变量)
代码如下:
#include <stdio.h>
size_t my_strlen(char* ptr)
{
if ((*ptr) != '\0')
{
return 1 + my_strlen(ptr+1);
}
else
{
return 0;
}
}
int main()
{
char arr[] = "beatles";
size_t len = my_strlen(arr);
printf("%u\n", len);
return 0;
}
画图分析递归调用过程:
2.strcpy
🍇源字符串必须以
\0
结束
🍇会将源字符串的\0
拷贝到目标空间
🍇目标空间必须足够的大,能容下源字符串内容
🍇目标空间可修改
😇学会strlen的模拟实现
🍇源字符串必须以\0
结束
🍇会将源字符串的\0
拷贝到目标空间
🍇目标空间必须足够大
🍇目标空间可修改
😇
strcpy
函数的模拟实现
完美代码:
#include<stdio.h>
#include<assert.h>
char* my_strcpy(char* dest, const char* src)
{
assert(dest&&src);//断言-release版本可以优化掉
char* ret = dest;
//1.拷贝字符串
//2.遇到\0为止
while (*dest++ = *src++ )
{
;
}
return ret;
}
int main()
{
char arr1[20] = "abc";
char arr2[] = "def";
printf("%s\n", my_strcpy(arr1, arr2));
return 0;
}
剖析:
3.strcat
字符串连接/追加。
🍇源字符串必须以
\0
结束
🍇目标空间足够大,能容纳下源字符串内容
🍇目标空间可修改
🍇自己给自己追加要用strncat
😇strcat
的模拟实现
🍇源字符串必须以\0
结束
🍇目标空间足够大,能容纳下源字符串内容
😇
strcat
的模拟实现—my_strcat
#include<stdio.h>
#include<assert.h>
char* strcat(char* dest, const char* src)
{
assert(dest&&src);//断言
char* ret = dest;
//1.找到目标字符串末尾'\0'
while (*dest != '\0')
{
dest++;
}
//2.追加字符串直到'\0'-与strcpy非常相似
while (*dest++ = *src++)
{
;
}
return ret;
}
int main()
{
char arr1[20] = "abc";
char arr2[] = "def";
printf("%s\n", strcat(arr1, arr2));
return 0;
}
4.strcmp
😇strcmp
的模拟实现my_strcmp
#include<stdio.h>
#include<assert.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;
}
int main()
{
char arr1[] = "abcd";
char arr2[] = "abc";
int ret = my_strcmp(arr1, arr2);
printf("%d\n", ret);
if (ret == 0)
{
printf("==\n");
}
else if (ret > 0)
{
printf(">\n");
}
else
{
printf("<\n");
}
}
剖析:
那么,以上strcpy
,strcat
,srtcmp
是没有长度限制的字符串函数,这些函数是相对不安全的。
下篇文章将介绍相对安全的,有长度限制的字符串函数strcpy
,strcat
,strcmp
。
有木有发现小边文章里出现的都是应季水果,小边天天都在吃哈哈哈哈哈
未完待续@边通书