在上一节中的均为字符串函数
而字符函数分为字符分类函数和字符转换函数
字符分类函数
函数 | 如果他的参数符合下列条件则返回真 |
---|---|
iscntrl | 任何控制字符 |
isspace | 空白字符,换页‘\f’ ,换行‘\n’,回车\r,制表符’'\t和垂直制表符‘\v’ |
isdigit | 十进制数字0-9 |
isxdigit | 十六进制数字,包括所有十进制数字,小写字母a-f,大写字母A-F |
islower | 小写字母a-z |
isupper | 大写字母A-Z |
isalpha | 字母a-z和A-Z |
isalnum | 字母或者数字,a-z,A-Z,0-9 |
ispunct | 标点符号,任何不属于数字或者字母的图形字符 |
isgraph | 任何图形字符 |
isprint | 任何可打印的字符,包括图形字符和空白字符 |
例:
#include<stdio.h>
#include<ctype.h>//islower的头文件
int main()
{
int ret = islower('a');
printf("%d",ret);//一个非0的值
return 0;
}
字符转换函数
tolower
把大写转小写
toupper
把小写转大写
int main()
{
int ret = toupper('a');
printf("%c\n",ret);//'A'
}
练习:把“Test String”全转化为小写
int main()
{
char arr[] = "Test String";
char* p =arr;
while(*p)
{
if(isupper(*p))
{
*p = tolower(*p);
}
p++;
}
printf("%s\n",arr);
return 0;
}
还有一系列内存相关的函数
内存函数
memcpy
strcpy仅仅是字符串的拷贝
而内存中的数据不仅仅是字符
注意第三个参数单位是字节
int main()
{
int arr1[10] = {0};
int arr2[] = {1,2,3,4,5};
//把arr2中的前五个整数的数据,拷贝到arr1中
memcpy(arr1,arr2,20);
return 0;
}
模拟实现memcpy
void* my_memcpy(void* dest,const void* src,size_t sz)
{
void* ret = dest;
assert(dest && src);
while(sz--)
{
*(char*)dest = *(char*)src;
dest = (char*)dest + 1;
src = (char*)src + 1;
}
return ret;
}
int main()
{
int arr1[10] = {0};
int arr2[] = {1,2,3,4,5};
//把arr2中的前五个整数的数据,拷贝到arr1中
my_memcpy(arr1,arr2,20);
return 0;
}
void* my_memcpy(void* dest,const void* src,size_t sz)
{
void* ret = dest;
assert(dest && src);
while(sz--)
{
*(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};
my_memcpy(arr1+2,arr1,20);//1,2,1,2,1,2,1,8,9,10
return 0;
}
不重叠的内存拷贝,可以使用memcpy
重叠的内存拷贝,要使用memmove
memmove
int main()
{
int arr1[] = {1,2,3,4,5,6,7,8,9,10};
memmove(arr1+2,arr1,20);//1,2,1,2,3,4,5,8,9,10
return 0;
}
模拟实现memmove
void* my_memmove(void* dest,const void* src,size_t sz)
{
assert(dest && src)
void* ret = dest;
if(dest<src)
{
//前->后
int i = 0;
for(i = 0;i<sz;i++)
{
*(char*)dest = *(char*)src;
dest = (char*)dest + 1;
src = (char*)src + 1;
}
}
else
{
while(sz--)
{
*((char*)dest+sz) = *((char*)src+sz);
dest = (char*)dest + 1;
src = (char*)src + 1;
}
}
}
int main()
{
int arr1[10] = {0};
int arr2[] = {1,2,3,4,5};
//把arr2中的前五个整数的数据,拷贝到arr1中
my_memmove(arr1,arr2,20);
return 0;
}
memset
memset是设置内存的
是以字节为单位设置内存的
int main()
{
char arr[] = "hello world";
memset(arr+6,'x',3);
printf("%s\n",arr);//结果是:hello xxxld
return 0;
}
int main()
{
int arr[10] = {0};
memset(arr,1,40);
//这里并没有把arr中的元素改成1
// 内存中存储的是 01 01 01 01
// 01 01 01 01
// :
// :
// 01 01 01 01
return 0;
}
memcmp
例1:
int main()
{
int arr1[]={1,2,3,4,5,6,7};
//01 00 00 00 02 00 00 00 03 00 00 00 04 00 00 00 05 00 00 00 06 00 00 00 00 07 00 00 00
int arr2[]={1,2,3,7};
//01 00 00 00 02 00 00 00 03 00 00 00 07 00 00 00
int ret = memcmp(arr1,arr2,12);
//前12个字节二者相等,返回0
return 0;
}
例2:
int main()
{
int arr1[]={1,2,3,4,5,6,7};
//01 00 00 00 02 00 00 00 03 00 00 00 04 00 00 00 05 00 00 00 06 00 00 00 00 07 00 00 00
int arr2[]={1,2,3,0x11223304};
//01 00 00 00 02 00 00 00 03 00 00 00 04 33 22 11
int ret = memcmp(arr1,arr2,13);
//前13个字节相等,返回0
return 0;
}