字符串和内存函数(二)

本文详细介绍了C语言中的字符分类函数如islower、字符转换函数如tolower和toupper,以及内存操作函数如memcpy、strcpy、memmove、memset和memcmp的用法和示例,展示了如何处理字符串和内存复制的场景。
摘要由CSDN通过智能技术生成

在上一节中的均为字符串函数

字符函数分为字符分类函数字符转换函数

字符分类函数

函数如果他的参数符合下列条件则返回真
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;
}
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

史嘉庆

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值