目录
前言
相信大家学习c语言碰到了很多的函数,像printf,scanf等,这篇博客会讲一些别的函数,可能对于初学者会比较陌生。不过,陌生不要害怕,正因为陌生我们就可以学习它,让它变成我们熟悉的知识,那么我们就进步了!
一、islower,isupper,tolower,toupper
islower和isupper这两个是用来判断字符是否为小写或大写的,它们的头文件为<ctype.h>,
#include<stdio.h>
#include<ctype.h>
int main()
{
int n = isupper('u');
printf("%d", n);
return 0;
}
如上运用,如果为假函数便会返回0,如果为真,函数返回非0数。
tolower和toupper,这两个函数是用于字母的大小写转换,如果要转为大写,而原本就是大写这个函数是不会动它的,转小写也一样。
#include<stdio.h>
#include<ctype.h>
int main()
{
char n = tolower('U');
printf("%c\n", n);
return 0;
}
如上,它们两个的头也是<ctype.h>,如上运用便可。
二、memcpy
这个函数可以实现内存拷贝,但是它是以字节来拷贝的,所以它可以拷贝任意类型的数据,我们可以联想到strcpy这个函数,但是这个函数只能运用在字符串上,有局限性。
#include<stdio.h>
#include<string.h>
int main()
{
int arr1[] = { 1,2,3,4,5,6,6 };
int arr2[20] = { 0 };
memcpy(arr2, arr1, 20);
for (int i = 0; i < 5; i++)
{
printf("%d ", arr2[i]);
}
return 0;
}
上图可以看到头文件是<string.h>,我们实现了将arr1中的20个字节的数据拷贝到了arr2中,
我们可以看到代码结果。
我们也可以对它进行一个模拟实现
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[10] = { 0 };
my_memcpy(arr2, arr1, 20);
return 0;
}
三、memmove
memmove这个函数可以说是memcpy的升级版,因为当我们要拷贝的数据有重叠时很可能就会出现错误,但是在vs这个编译器上这两个函数得到的结果是一样的,看不出它们的不同,不过在其他编译器上很可能就会出问题。
它的运用和memcpy一样,我们也可以对它进行一个模拟实现
void* my_memmove(void* dest, void* src, size_t num)
{
void* ret = dest;
assert(dest);
assert(src);
if (dest < src)//1 前->后
{
while(num--)
{
*(char*)dest = *(char*)src;
dest = (char*)dest + 1;
src = (char*)src + 1;
}
}
else //2 3 后->前
{
while (num--)
{
*((char*)dest + num) = *((char*)src + num);
}
}
return ret;
}
代码里的if-else,前到后,后到前,是看它的数据的位置,上图可知。
总结
以上就是本篇博客要介绍的几个函数。
感谢支持!