- 求字符串长度
strlen- 长度不受限制的字符串函数
strcpy
strcat
strcmp- 长度受限制的字符串函数介绍
strncpy
strncat
strncmp
1 stelen
size_t strlen ( const char * str );
- 字符串已经 ‘\0’ 作为结束标志,strlen函数返回的是在字符串中 ‘\0’ 前面出现的字符个数(不包 含 ‘\0’ )。
- 参数指向的字符串必须要以 ‘\0’ 结束。
- 注意函数的返回值为size_t,是无符号的
1.1 库函数strlen模拟实现
1.递归实现
//递归
int my_strlen1(const char* str)
{
assert(str != NULL);
if (*str != '\0')
return 1 + my_strlen(str + 1);
else
return 0;
}
指针-指针方式实现
int my_strlen2(const char* str)
{
const char* start = str;
assert(str != NULL);
while (*str)
{
str++;
}
return str - start;
}
普通实现
#include <stdio.h>
int my_strlen(const char* str)
{
assert(str != NULL);
int count = 0;
while (*str != '\0')
{
count++;
str++;
}
return count;
}
//strlen 是求字符串长度的,求出的长度是不可能为负数的
//所以返回类型设置为size_t 也是合情合理的
typedef unsigned int size_t;
size_t strlen(const char* string);
int main()
{
char arr[] = "abcdef";
int len = my_strlen(arr);
printf("%d\n", len);
return 0;
}
2 strcpy
char* strcpy(char * destination,const char *source)
- 源字符串必须以 ‘\0’ 结束。
- 会将源字符串中的 ‘\0’ 拷贝到目标空间。
- 目标空间必须足够大,以确保能存放源字符串。
- 目标空间必须可变。
2.1 库函数strcpy模拟实现
#include<stdio.h>
#include<assert.h>
char* my_strcpy(char* dest, const char* sour)
{
assert(dest && sour);
char* ret = dest;
while (*dest++ = *sour++)
{
;
}
return ret;
}
int main()
{
char arr[20] = " ";
char test[] = "cbdfghj";
my_strcpy(arr,test);
printf("%s\n", arr);
return 0;
}

3 strcat
char * strcat ( char * destination, const char * source )
- 源字符串必须以 ‘\0’ 结束。
- 目标空间必须有足够的大,能容纳下源字符串的内容。
- 目标空间必须可修改。
- strcat不能给自己追加。\0会被覆盖,导致字符串找不到\0,使代码死循环
3.1 strcat库函数模拟实现
#include<stdio.h>
#include<assert.h>
char* my_strcat(char* dest, const char* src)
{
assert(dest && src);
char* ret = dest;
//首先找到目标空间的'\0'
while (*dest)
{
dest++;
}
//然后追加,就是strcpy思路一样,会把‘\0’拷贝过去
//注意这里追加就会把目标字符串的结尾‘\0’直接覆盖,
// 所以不能自己给自己追加,这样就没有'\0'了
while (*dest++ = *src++)
{
;
}
return ret;
}
int main()
{
char arr[20] = "dfef ";
char test[] = "cbdfghj";
int ret = my_strcat(arr,test);
printf("%s\n", arr);
return 0;
}

4 strcmp
int strcmp ( const char * str1, const char * str2 );
- 标准规定:
第一个字符串大于第二个字符串,则返回大于0的数字
第一个字符串等于第二个字符串,则返回0
第一个字符串小于第二个字符串,则返回小于0的数字
vs2022中是大于返回1 ,小于返回-1,相等返回0
4.1 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++;
}
/*if (*str1 > *str2)
return 1;
else
return -1;*/
return *str1 - *str2;
}
int main()
{
char arr[20] = "dfef ";
char test[] = "cbdfghj";
int ret = my_strcmp(arr,test);
printf("%d\n", ret);
return 0;
}

上面的:strcpy/strcat/strcmp都是长度不受限制的字符串函数,操作不当就容易越界,使得栈崩溃
C语言就又有了以下的长度受限制的字符串函数:strncpy/strncat/strncmp
在上面不受限的函数中添加了一个参数,指明要操作的长度
5 strncpy
char * strncpy ( char * destination, const char * source, size_t num );

- 拷贝num个字符从源字符串到目标空间。
如果源字符串的长度小于num,则拷贝完源字符串之后,在目标的后边追加0,直到num个
5.1 模拟实现strncpy
#include<assert.h>
char* my_strncpy(char* destination, const char* source, size_t num)
{
assert(destination && source);
char* statr = destination;//记录起始位置
while (num && (*destination++ = *source++))//搬运数据
{
num--;
}
if (num)//当num大于source长度时候,补充"\0"
{
while (--num)
{
*destination++ = '\0';
}
}
return statr;
}
int main()
{
char arr1[] = "abcdefghi";
char arr2[] = "bit";
my_strncpy(arr1, arr2, 6);
printf("%s\n", arr1);
return 0;
}

6 strncat
char * strncat ( char * destination, const char * source, size_t num );

- 将源的前 number 个字符复制到目标。如果在复制 num 个字符之前找到源 C 字符串的末尾(由 null 字符表示),则目标将填充零,直到写入总数 num 个字符为止。
- 如果 source 长于 num,则不会在 destination 的末尾隐式附加 null 字符。因此,在这种情况下, destination 不应被视为以 null 结尾的 C 字符串(因此读取它会溢出)。
- destination 和 source 不应重叠
6.1 模拟实现strncat
#include<assert.h>
char* my_strncat(char* destination, const char* source, size_t num)
{
assert(destination && source);
char* start = destination;
while (*destination != '\0') {
destination++;
}
// 将源字符串的前n个字符追加到目标字符串后面
while (num && (*destination++ = *source++) != '\0') {
num--;
}
// 在新字符串的末尾添加空字符
*destination = '\0';
return start;
}
int main()
{
char arr1[20] = "I LOVE YOU ";
my_strncat(arr1, "SORRY", 3);
// 经过函数My_strncat后,arr1里应该是字符串"I LOVE YOU SOR"
printf("arr1: %s\n", arr1);
return 0;
}

7 strncmp
int strncmp ( const char * str1, const char * str2, size_t num )

- 比较到出现另个字符不一样或者一个字符串结束或者num个字符全部比较完。

1394

被折叠的 条评论
为什么被折叠?



