目录
一.字符分类函数
在上一篇博客中我们介绍了部分<string.h>中常用的部分字符串操作函数,我们在这里介绍以下字符分类函数。
<ctype.h>中提供了一些对于字符的判断的函数,如果符合函数情况则返回真。
函数 | 如果符合情况则返回真 |
---|---|
iscntrl | 任何的控制字符 |
isspace | 空白字符:空格‘ ’,换页‘\f’,换行'\n',回车‘\r’,制表符'\t'或者垂直制表符'\v' |
isdigit | 十进制数字0-9 |
isxdigit | 十六进制数字,包括0-9,小写的a~f,大写的A~F |
islower | 小写字母a~z |
isupper | 小写字母a~z |
isalpha | 小写字母a~z,大写字母A~Z |
isalnum | 字母或者数字0~9,小写字母a~z,大写字母A~Z |
ispunct | 标点符号 |
isgraph | 任何图形字符 |
isprint | 任何可打印字符,包括图形字符和标点符号 |
字符转化函数
1.int tolower(char c) //转小写
2.int toupper(char c) //转大写
举例说明:
二.内存操作函数
2.1memcpy
void * memcpy ( void * destination, const void * source, size_t num );
需要注意的是:函数memcpy从source的位置开始向后复制num个字节的数据到destination的内存位置。 这个函数在遇到 '\0' 的时候并不会停下来。如果source和destination有任何的重叠,复制的结果都是未定义的。
举例:
模拟实现:
我们模拟实现这个函数,通过观察原函数型式和参数还有结果,我们得到以下模拟实现过程。
#include<assert.h>
void* my_memcpy(void* dst, void* src, int sz)
{
assert(dst != NULL);
assert(src != NULL);
void* ret = dst;
while (sz)
{
*(char*)dst = *(char*)src;
((char*)dst)++;
((char*)src)++;
sz--;
}
return ret;
}
2.2memmove
void * memmove ( void * destination, const void * source, size_t num );
注意事项:与memcpy大致功能相同,不同点在于,memcpy的源字符串和目标字符串不能有内容上的重叠,但是memmove可以有。
我们来举个例子看一下:
我们可以将复制情况先分为三种情况来讨论。
好的,原理讲解完了我们来看一下模拟实现
void* my_memmove(void* dst, void* src, int sz)
{
assert(dst != NULL);
assert(src != NULL);
void* ret = dst;
if (dst < src)//dst在src左边
{
while (sz)//从左往右复制
{
*(char*)dst = *(char*)src;
((char*)dst)++;
((char*)src)++;
sz--;
}
}
else
{
while (sz)
{
*((char*)dst + sz-1) = *((char*)src + sz-1);
sz--;
}
}
return ret;
}
2.3memcmp
int memcmp ( const void * ptr1, const void * ptr2, size_t num );
比较ptr1和ptr2前num个字节的大小,返回值如下:
举例: