前言:
字符函数与内存函数的优劣:
字符函数如果处理字符相关的数据的话,用起来比较方便。相较于字符串函数,内存函数可以处理除字符外的其他类型的数据。
目录
1.字符串函数
1.1 strcpy
介绍:
将 source 中的字符数据覆盖式(将'\0'拷贝到destion中)的拷贝到 destion中,并返回 destion 的字符串的首地址。
模拟实现:
#include <assert.h>
#include <stdio.h>
char* my_strcpy(char* dest, const char* src)
{
//断言防止dest和src为空指针
assert(dest != NULL && src != NULL);
char* tmp = dest;
// * 的优先级高 ,所以先解引用在++,直到src将'\0'赋值给dest
while (*dest++ = *src++)
{
;
}
return tmp;
}
int main()
{
char s1[100];
char* s2 = "hello world!";
char *ret = my_strcpy(s1, s2);
printf("%s\n", ret);
}
1.2 strcmp
介绍:
比较字符串的大小,就是一个一个的字符的比较。
注意:返回值,如果
str1>str2 ,则返回大于0的数;
str1<str2,则返回小于0的数;
str1=str2,则返回0。
模拟实现:
#include <stdio.h>
#include <assert.h>
int my_strcmp(const char* dest, const char* src)
{
assert(dest&&src);
//当dest与src不同时,跳出循环
while (*dest == *src)
{
//这时dest与src相同,并且都是'\0'
if (*dest == '\0')
return 0;
dest++;
src++;
}
return *dest - *src;
}
int main()
{
char s1[10] = "abcef";
char s2[10] = "abcef";
int ret = my_strcmp(s1, s2);
if (ret == 0)
printf("s1=s2");
else if (ret > 0)
printf("s1>s2");
else
printf("s1<s2");
return 0;
}
1.3 strcat
介绍:
在 destion 所指向的字符串后,追加 source 所指向的字符串。
模拟实现:
#include <stdio.h>
#include <assert.h>
char* my_strcat(char* dest, const char* src)
{
assert(dest && src);
char* tmp = dest;
//通过while循环是dest指向'\0'
while (*dest != '\0')
dest++;
//将src拷贝到dest'\0'之后的位置
while (*dest++ = *src++)
{
;
}
return tmp;
}
int main()
{
char s1[20] = "hello ";
char* s2 = "world!";
char *ret = my_strcat(s1, s2);
printf("%s", ret);
return 0;
}
1.4 strncpy strncmp strncat
介绍:
相较于前面的函数,就多了个参数 num(决定你要拷贝,比较或追加多少字节)
注意:num的单位是字节
接下来就只附实现代码喽。
模拟实现:
strncpy:
#include <assert.h>
#include <stdio.h>
char* my_strncpy(char* dest, const char* src,size_t num)
{
assert(dest != NULL && src != NULL);
int i = 0;
//若i<num时,src[i]是'\0',则直接跳出循环,后面的就不拷贝了
for (i = 0; src[i]!='\0'&&i < num; i++)
{
dest[i] = src[i];
}
//一定要在dest拷贝完的结尾加上'\0'
if(i<num)//也可以不判断,若不判断就是覆盖式拷贝
dest[i] = '\0';
return dest;
}
int main()
{
char s1[100] = "I don't know";
char* s2 = "hello world!";
char *ret = my_strncpy(s1, s2,5);
printf("%s\n", ret);
}
strncmp:
#include <stdio.h>
#include <assert.h>
int my_strncmp(const char* dest, const char* src,size_t num)
{
assert(dest && src);
int i = 0;
for (i = 0; i < num; i++)
{
//如果不相同返回
if (dest[i] != src[i])
return dest[i] - src[i];
}
return 0;
}
int main()
{
char s1[10] = "abcef";
char s2[10] = "abdef";
int ret = my_strncmp(s1, s2, 2);
if (ret == 0)
printf("s1=s2");
else if (ret > 0)
printf("s1>s2");
else
printf("s1<s2");
return 0;
}
strncat:
#include <stdio.h>
#include <assert.h>
char* my_strncat(char* dest, const char* src,size_t num)
{
assert(dest && src);
char* tmp = dest;
//通过while循环使dest指向字符串结束标志'\0'
while (*dest != '\0')
dest++;
int i = 0;
for (i = 0; i < num; i++)
{
dest[i] = src[i];
}
//最后追加完,在字符串末尾加上'\0'
dest[i] = '\0';
return tmp;
}
int main()
{
char s1[20] = "hello ";
char* s2 = "world!";
char *ret = my_strncat(s1, s2 , 3);
printf("%s", ret);
return 0;
}
2.内存函数
2.1 memcpy
介绍:
跟strcpy差不多,这里就不多介绍了,但注意以下两点
1.memcpy 可以拷贝 除字符串外的其他类型的数据
2.memcpy 不可以重叠的拷贝,重叠拷贝就是将自己的一部分拷贝给自己,但库里给的函数可以实现。
模拟实现:
#include <stdio.h>
#include <assert.h>
void* my_memcpy(void* dest, const void* src, size_t num)
{
assert(dest && src);
while (num--)
{
//使用void* 的指针需要强制类型转换
*((char*)dest + num) = *((char*)src + num);
}
return dest;
}
int main()
{
int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
int arr1[10] = { 0 };
my_memcpy(arr1, arr, 20);
for (int i = 0; i < 10; i++)
printf("%d ", arr1[i]);
return 0;
}
2.2 memmove
敲黑板楼,这里是重点。
简介:
就是将 src 中 num 个字节的数据拷贝到 src中,与memcmp 相比 ,它可以实现重叠拷贝。
实现思路:(主要讲重叠拷贝的思路)若不重叠怎么拷贝都可以。
dest <src:从前往后拷贝
dest = src :从前往后或从后往前都可以
dest>src:从后往前拷贝
情况1:(dest>src)图解
情况2:(dest<src)
模拟实现:
#include <stdio.h>
#include <assert.h>
void* my_memmove(void* dest,const void* src, size_t num)
{
assert(dest&&src);
//从前往后拷贝
if (dest < src)
{
for (int i = 0; i < num; i++)
{
*((char*)dest + i) = *((char*)src + i);
}
}
//从后往前拷贝
else
{
while (num--)
{
*((char*)dest + num) = *((char*)src + num);
}
}
return dest;
}
int main()
{
int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
my_memmove(arr + 2, arr, 20);
int sz = sizeof(arr) / sizeof(arr[0]);
for (int i = 0; i < sz; i++)
{
printf("%d ", arr[i]);
}
return 0;
}
还有memset memcmp等这里就不多介绍了。
结语:
头回写这么多,希望自己能继续坚持。
祝愿大家c语言能越学越好。
标签:src,函数,dest,char,int,num,内存,字符串,include From: https://blog.csdn.net/2402_82658387/article/details/136752713