目录
一、字符函数
1.strlen函数
1.1strlen函数的介绍
1.2strle函数的使用
1.3模拟实现strlen
1.3.1指针移动法
1.3.2指针减去指针法
1.3.3函数递归法
2.strcpy函数
编辑
2.1strcpy函数的介绍
2.2strcpy函数的使用
2.3模拟实现strcpy
3.strcat函数
3.1strcat函数的介绍
3.2strcat函数的使用
3.3模拟实现strcat
4.strcmp函数
4.1strcmp函数的介绍
4.2strcmp函数的使用
4.3模拟实现strcmp函数
5.strstr函数
5.1strstr函数的介绍
5.2strstr函数使用
5.3模拟实现strstr函数
二、内存函数
1.memcpy函数
1.1memcpy函数的介绍
1.2 memcpy函数的使用
1.3模拟实现memcpy
2.memmove函数编辑
2.1memmove函数的介绍
2.2memmove函数的使用
2.3模拟实现memmove
一、字符函数
1.strlen函数
1.1strlen函数的介绍
strlen函数的作用:得到一个 字符串的长度
通过查询我们看到strlen函数的定义:参数为const修饰的指针,返回类型为size_t。
注意:
1. strlen函数的返回类型为size_t(无符号整形)
int main()
{
if (strlen("abc") - strlen("abcdef") > 0)
{
printf("大于\n");
}
else
{
printf("小于等于\n");
}
return 0;
}
为什么是大于呢?
-3
原码:1000 0000 0000 0000 0000 0000 0000 0011
反码:1111 1111 1111 1111 1111 1111 1111 1100
补码:1111 1111 1111 1111 1111 1111 1111 1101
因为是无符号数最高位就不是符号为是一个大于零数所以打印结果为大于
2.所求字符串必须是以'\0'结尾
int main()
{
char arr[5] = { 'a','b','c','d','e' };
printf("%d \n", strlen(arr));
return 0;
}
1.2strle函数的使用
int main()
{
char arr[] = "hello world";
printf("%d\n", strlen(arr));
return 0;
}
1.3模拟实现strlen
这里提供三种方法给大家参考
1.3.1指针移动法
size_t my_strlen(char* str)
{
int num = 0;
while (*str != 0)
{
str++;
num++;
}
return num;
}
int main()
{
size_t ret = my_strlen("abcdef");
printf("%d\n", ret);
return 0;
}
1.3.2指针减去指针法
size_t my_strlen(char* str)
{
char* p = str;
while (*str != '\0')
{
str++;
}
return str - p;
}
int main()
{
size_t ret = my_strlen("abcdef");
printf("%d\n", ret);
return 0;
}
1.3.3函数递归法
size_t my_strlen(char* str)
{
if (*str == 0)
{
return 0;
}
else
{
str++;
return 1 + my_strlen(str);
}
}
int main()
{
size_t ret = my_strlen("abcdef");
printf("%d \n", ret);
return 0;
}
2.strcpy函数
2.1strcpy函数的介绍
strcpy函数的作用:将一个字符串拷贝到另外一个字符串中
通过查询我们可知:strcpy函数的返回类型为char *,第一个参数为 char *destination (目标字符串指针),第二个参数为 char * source(被拷贝字符串的指针)
注意:
1.源字符串必须以 '\0' 结尾。
2.会将源字符串中的'\0'拷贝到目标空间。
3.目标空间必须走勾搭,以确保能存放源字符串
4.目标空间必须可变。
2.2strcpy函数的使用
int main()
{
char arr1[] = "xxxxxxxxxxxxxxx";
printf("arr1拷贝前:%s \n",arr1);
char arr2[10] = "abcdefgh";
char* ret = strcpy(arr1, arr2);
printf("\narr1拷贝后: %s \n", ret);
return 0;
}
2.3模拟实现strcpy
char* my_strcpy(char* str2,const char* str1)
{
assert(*str1 && *str2);
char* ret = str2;
while (*str1)
{
*str2 = *str1;
str1++;
str2++;
}
*str2 = *str1;
//源字符串 '\0'的打印
while (*str2++ = *str1++)
{
;
}
return ret;
}
int main()
{
char arr1[20] = "abcdef";
char arr2[] = "xxxxxxxxxx";
//目标空间必须可变
printf("arr2数组copy前:%s\n", arr2);
char *p=my_strcpy(arr2, arr1);
printf("arr2数组copy后:%s\n",p);
return 0;
}
3.strcat函数
3.1strcat函数的介绍
strcat函数的作用:用于将一个字符串(源字符串)连接到另一个字符串(目标字符串)的末尾,简单点来说就是将两个毫不相干的字符串连接在一起组成一个新的字符串。
通过查询我们可知:strcat函数的参数,返回值类型和strcpy函数的类型和意义都相同
注意:
1.源字符串必须以 '\0' 结尾
2.目标空间必须足够大,能够容下源字符串的内容。
3.目标空间必须可以修改。
3.2strcat函数的使用
int main()
{
char arr1[100] = "hello ";
char arr2[10] = "world";
char* ret = strcat(arr1, arr2);
printf("%s \n", ret);
return 0;
}
3.3模拟实现strcat
char* my_strcat(char* str1,const char* str2)
{
char* p = str1;
while (*str1 != '\0')
{
str1++;
}
while (*str1++ = *str2++);
return p;
}
int main()
{
char arr1[100] = "hello ";
char arr2[] = "world";
char* ret = my_strcat(arr1, arr2);
printf("%s\n", ret);
return 0;
}
4.strcmp函数
4.1strcmp函数的介绍
strcmp函数的作用:用于比较两个字符串的大小。
通过查询我们可知:strcmp函数的返回值为intl类型,参数为const修饰不可修改的连个 char * 类型的指针;
注意:
标准规定:
第一个字符串大与第二个字符串,则返回大于0的数字。
第一个字符串等于第一个字符串,则返回0。
第一个字符串小于第一个字符串,则返回小于0的数字。
那么如何判断两个字符串呢?
说是比较字符串的大小,其实是比较字符传中每个字符的大小。
从两个字符串中的起始字符开始按照标准规定一个一个比较下去,知道判断出某一个字符的大小,才会返回数字,如果返回0的话意味着两个字符串中的每个字符都相等。
4.2strcmp函数的使用
int main()
{
char arr1[] = "abc";
char arr2[] = "adc";
int ret = strcmp(arr1, arr2);
printf("%d \n", ret);
return 0;
}
在这个例子中arr1字符串中的第二个字符 'b' 小于arr2字符串中的第二个字符 'd',所以返回一个小于0的数字。
4.3模拟实现strcmp函数
int my_strcmp(char* str1, char* str2)
{
while (*str1 == *str2)
{
if (*str1 == '\0')
{
return 0;
}
str1++;
str2++;
}
return *str1 - *str2;
}
int main()
{
char arr1[] = "abc";
char arr2[] = "abc";
int ret = my_strcmp(arr1,arr2);
printf("%d\n", ret);
return 0;
}
5.strstr函数
5.1strstr函数的介绍
strstr函数的作用:用于在一个字符串中查找另一个字符串的第一次出现的位置。(判断一个字符串是否为一个字符串的子字符串)。
通过查询我们可知:strstr函数的返回值为char * 类型的指针,参数为两个不可修改的char *类型的指针
5.2strstr函数使用
int main()
{
char arr1[] = "abbbcde";
char arr2[] = "bbc";
char* ret = strstr(arr1, arr2);
printf("%s \n", ret);
return 0;
}
5.3模拟实现strstr函数
char* my_strstr(char *str1, char* str2)
{
char* cp = str1;
char* s1 = str1;
char* s2 = str2;
if (*str2 == '\0')
return str1;
while (*cp)
{
s1 = cp;
s2 = str2;
while (*s1 && *s2 && *s1 == *s2)
{
s1++;
s2++;
}
if (*s2 == '\0')
return cp;
cp++;
}
return NULL;
}
int main()
{
char arr1[] = "abbbcdef";
char arr2[] = "bbc";
char* ret = my_strstr(arr1, arr2);
if (ret != NULL)
printf("%s\n", ret);
else
printf("找不到\n");
return 0;
}
二、内存函数
1.memcpy函数
1.1memcpy函数的介绍
通过查询我们可知:用于将一段内存的内容复制到另一段内存区域。
1. 函数memcpy从source的位置开始向后复制num个字节的数据到destination的内存位置。
2. 这个函数在遇到 '\0' 的时候并不会停下来。
3. 如果source和destination有任何的重叠,复制的结果都是未定义的
1.2 memcpy函数的使用
将arr1中的40个字节的数据复制到arr2中
int main()
{
int arr1[] = { 1,2,3,4,5,6,7,8,9,0 };
int arr2[20] = { 0 };
memcpy(arr2, arr1, 40);
int i = 0;
for (i = 0; i < 20; i++)
{
printf("%d ", arr2[i]);
}
return 0;
}
1.3模拟实现memcpy
void* my_memcpy(void* dest, void* src, size_t num)
{
void* ret = dest;
while (num--)
{
*(char*)dest = *(char*)src;
dest = (char*)dest + 1;
src = (char*)src + 1;
}
return ret;
}
int main()
{
int arr1[] = { 1,2,3,4,5,6,7,8,9,10 };
int arr2[20] = { 0 };
my_memcpy(arr2, arr1, 40);
int i = 0;
for (i = 0; i < 20; i++)
{
printf("%d ", arr2[i]);
}
return 0;
}
2.memmove函数
2.1memmove函数的介绍
通过查询我们可知:用于在内存中移动一段数据块的内容。
1. 和memcpy的差别就是memmove函数处理的源内存块和目标内存块是可以重叠的。
2. 如果源空间和目标空间出现重叠,就得使用memmove函数处理。
2.2memmove函数的使用
int main()
{
int arr1[10] = { 1,2,3,4,5,6,7,8,9,0 };
memmove(arr1 + 2, arr1, 20);
int i = 0;
for (i = 0; i < 10; i++)
{
printf("%d ", arr1[i]);
}
return 0;
}
2.3模拟实现memmove
void* my_memmove(void* dest, void* src,size_t num)
{
void* ret = dest;
if (dest < src)
{
while (num--)
{
*(char*)dest = *(char*)src;
dest = (char*)dest + 1;
src = (char*)src + 1;
}
}
else
{
while (num--)
{
*((char*)dest + num) = *((char*)src + num);
}
}
return ret;
}
int main()
{
int arr1[10] = { 1,2,3,4,5,6,7,8,9,10 };
my_memmove(arr1, arr1+2 ,20);
int i = 0;
for (i = 0; i < 10; i++)
{
printf("%d ", arr1[i]);
}
return 0;
}