:purple_heart:在本专题内 将重点介绍:
:star: 字符函数
:star: 字符串函数
:star: 内存函数
这些库函数的使用和注意事项。
这些注意事项有些看似是很不起眼,但是我们必须充分了解以便自己能模拟实现。
所以在看注意事项时,一是要在未来使用时多注意,二是要思考对应需求如何用代码实现。
有:
:apple:求字符串长度的函数
1.strlen
:apple:长度不受限制的字符串函数
1.strcpy
2.strcat
3.strcmp
:apple:长度受限制的的字符串函数
1.strncpy
2.strncat
3.strncmp
引:
C语言中对字符和字符串的处理很是频繁,但是C语言本身没有字符串类型,字符串通常放在常量字符串
和字符数组
中。
正文开始@边通书
学习这块内容,要勤查阅此网站:
点击直达http://www.cplusplus.com/
1.strlen
下面将围绕这几点详细展开:
:grapes:strlen函数用来计算字符串长度,返回的是\0
之前出现字符个数
:grapes:参数指向字符串必须以\0
结束
:grapes:函数的返回值类型为size_t
,即 无符号整型(易错)
:innocent:学会strlen的模拟实现(三种方法:1.计数器 2.指针-指针 3.递归 ---不创建任何临时变量实现求字符串长度
)
:grapes: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;
}
:grapes:参数指向字符串必须以\0
结束
:innocent:strlen
的模拟实现---my_strlen
(三种方式)
:fish: 计数器
:fish: 指针 - 指针
:fish: 递归(不创建临时变量)
代码如下:
#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
:grapes:源字符串必须以\0
结束
:grapes:会将源字符串的\0
拷贝到目标空间
:grapes:目标空间必须足够的大,能容下源字符串内容
:grapes:目标空间可修改
:innocent:学会strlen的模拟实现
:grapes:源字符串必须以\0
结束
:grapes:会将源字符串的\0
拷贝到目标空间
:grapes:目标空间必须足够大
:grapes:目标空间可修改
:innocent:
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
字符串连接/追加。
:grapes:源字符串必须以\0
结束
:grapes:目标空间足够大,能容纳下源字符串内容
:grapes:目标空间可修改
:grapes:自己给自己追加要用strncat
:innocent:strcat
的模拟实现
:grapes:源字符串必须以\0
结束
:grapes:目标空间足够大,能容纳下源字符串内容
:innocent: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
:innocent: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
。
有木有发现文章里出现的都是应季水果,我天天都在吃哈哈哈哈哈