文章目录
部分字符串库函数的模拟实现
1. strlen
函数
1.1 函数介绍
- 头文件:
string.h
; - 函数原型:
size_t strlen (const char * str)
; - 作用:
- 参数说明:
size_t
:说明strlen
函数的返回值类型是size_t
,即无符号整型(unsigned int
);const char * shr
:说明strlen
函数接受的参数为只读的字符串指针;
- 使用注意事项:
- 字符串以
\0
作为结束标志,strlen
函数返回的是在字符串中\0
前面出现的字符个数(不包含\0
); - 参数指向的字符串必须要以
\0
结束;
- 字符串以
1.2 strlen
函数的模拟实现
1.2.1 方法一:简单粗暴的循环
size_t myStrlen(const char * string) {
size_t count = 0;
while(*(string + count)) {
count++;
}
return count;
}
或者:
size_t myStrlen (const char * string) {
size_t count = 0;
for( ; *(string + count); count++) {
;
}
return count;
}
1.2.2 方法二:指针-指针
size_t myStrlen(const char* string) {
char* start = string;
while(*string) {
;
}
return string - start;
}
1.2.3 方法三:递归
size_t myStrlen(const char * string) {
if(*string) {
return 1 + myStrlen(string + 1);
}
else {
return 0;
}
}
2. strcpy
函数
2.1 函数介绍
- 头文件:
string.h
; - 函数原型:
char * strcpy ( char * destination, const char * source )
; - 作用:将源指针指向的 C 字符串复制到目标指针指向的字符数组中,包括终止空字符(并在该点停止,即不会复制
\0
)。 - 参数说明:
char *
:说明strcpy
函数的返回值是字符串指针,实际上返回的指针是目标字符数组的指针;char * destination
:目标字符数组的指针;const * source
:元字符数组的指针,且为只读;
- 使用注意事项:
- 源字符串必须以
\0
结束; - 目标字符数组的空间必须足够大,确保能完整放下整个源字符串,包括
\0
; - 目标数组数组必须是可修改的左值;
- 源字符串必须以
- 以上用语均用字符数组是为了强调
char string[] = "Hello World";
和char string = "Hello World";
的区别,后者为字符常量,是不可修改的左值。
2.2 strcpy
函数的模拟实现
char* myStrcpy(char * destiantion, const char * source) {
char * returnArgument = destination;
//判断是否为空指针
assert(destination != NULL);
assert(source != NULL);
//assert库函数的使用必须包含头文件 assert.h , 此处用if判断亦可
while((*destination++ = *source++)) {
;
}
return returnArgument;
}
3. strcat
库函数
3.1 函数介绍
- 头文件:
string.h
; - 函数原型:
char * strcat ( char * destination, const char * source )
; - 作用:将源字符串的副本附加到目标字符串。 目标中的
\0
被源字符的第一个字符覆盖,并且目标中两者串联形成的新字符串的末尾包含一个\0
。 - 参数说明:
char *
:说明strcpy
函数的返回值是字符串指针,实际上返回的指针是目标字符数组的指针;char * destination
:指向目标数组的指针,该数组应包含 C 字符串,并且足够大以包含连接的结果字符串。char * source
:要附加的 C 字符串。
3.2 strcat
函数的模拟实现
char * myStrcat (char * destination, const char * source) {
char * returnArgument = destination;
assert(destiantion != NULL);
assert(source != NULL);
while(*destination) {
destination++;
}
while ((*destination++ = * source++)) {
;
}
return returnArgument;
}