目录
字符函数:
1.字符分类函数
2.字符转换函数
1.11字符分类函数
函数 | 如果他的参数符合下列条件就返回真 |
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 | 任何可打印字符,包括图形字符和空白字符 |
int main()
{
char ch = 'p';
if (islower(ch))
{
printf("小写\n");
}
else
{
printf("非小写\n");
}
return 0;
}
1.12字符转换函数
int tolower ( int c ); 转换小写
int toupper ( int c ); 转换大写
int main()
{
int ret = toupper('a');
printf("%c\n", ret);
return 0;
}
运行结果如下
int main()
{
char arr[] = "Test String.\n";
char* p = arr;
while (*p)
{
if (isupper(*p))
{
*p = tolower(*p);
}
p++;
}
printf("%s", arr);
return 0;
}
运行结果如下
1.13内存相关的函数
memcpy ---- strcpy
memove
memest
memcmp --- strcmp
1.13.1memecpy的模拟实现
#include<string.h>
#include<assert.h>
void* my_memcpy(void* dest, 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;
}
但是当my_memcpy拷贝重叠内存的时候就会出现以下情况
当使用memcpy的时候就是正常的
因为标准值规定memcpy来实现不重叠内存的拷贝
memcp - 60分
重叠内存的拷贝 要用么memove来实现
但是你会发现在vs2019跟vs2022的环境下memcpy也能实现重叠内存的拷贝
当前环境memcpy - 100分
所以我们模拟实现的my_memcpy处理不了 但是他自身的memcpy能实现
1.13.2模拟实现memove
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*)src = *(char*)dest;
dest = (char*)dest + 1;
src = (char*)src + 1;
}
return ret;
}
else
{
//从后向前拷贝
while (sz--)
{
*((char*)dest + sz) = *((char*)src + sz);
}
}
}
int main()
{
int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
my_memmove(arr+2, arr, 20);
int i = 0;
for (i = 0; i < 10; i++)
{
printf("%d ", arr[i]);
}
return 0;
}
1.13.2memset
是设置内存的
是以字节为单位设置内存的
int main()
{
//char arr[] = "hello world";
//memset(arr+6,'x',3);
//printf("%s\n", arr);
int arr[10] = { 0 };
memset(arr, 1, 40);
return 0;
}
1.13.3memcmp
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 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, 13);
printf("%d", ret);
return 0;
}
运行结果如下
当我将7的值修改为0x11223304的时候 如下
所以memcpy是以字节的方式进行比较的