千家信息网

c语言中字符串与内存函数有哪些

发表于:2026-10-31 作者:千家信息网编辑
千家信息网最后更新 2026年10月31日,这篇文章主要为大家展示了"c语言中字符串与内存函数有哪些",内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下"c语言中字符串与内存函数有哪些"这篇文章吧。一.字符
千家信息网最后更新 2026年10月31日c语言中字符串与内存函数有哪些

这篇文章主要为大家展示了"c语言中字符串与内存函数有哪些",内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下"c语言中字符串与内存函数有哪些"这篇文章吧。

一.字符串函数

1. 求字符串长度的strlen

size_t strlen ( const char * str );

  • 字符串以 '\0' 作为结束标志,strlen函数返回的是在字符串中 '\0' 前面出现的字符个数(不包含 '\0' )。

  • 参数指向的字符串必须要以 '\0' 结束。

  • 注意函数的返回值为size_t,是无符号的。

模拟实现strlen

size_t my_strlen(const char*str){   size_t count=0;  while(*str)  {   str++;   count++;  }

2.比较字符串大小的strcmp

int strcmp ( const char * str1, const char * str2 );

  • 从str1和str2指向的位置开始比较,如果遇到两个不相等的字符或者\0函数结束并且返回值。

  1. 第一个字符串的字符大于第二个字符串的字符返回 >0的数字。

  2. 第一个字符串的字符等于第二个字符串的字符返回 =0的数字。

  3. 第一个字符串的字符小于第二个字符串的字符返回 <0的数字。

模拟实现strcmp

int my_strcmp(const char*str1,const char*str2){   while (*str1 == *str2)   {    if (*str1 && *str2)//判断'\0'     return *s2 - *s1;    *str1++;    *str2++;   }//循环结束标志*str1!=*str2   return *str2 - *str1;}

3.复制字符串的strcpy

char* strcpy(char * destination, const char * source)

拷贝source到destination中,返回一个指向dest的char* 的指针。

  • 源字符串必须以 '\0' 结束。

  • 会将源字符串中的 '\0' 拷贝到目标空间。

  • 目标空间必须足够大,以确保能存放源字符串。

  • 目标空间必须可变。

模拟实现strcpy

char *my_strcpy(char *dest, const char*src){  char *ret = dest; while((*dest++ = *src++)) {  ; } return ret;}

4.追加字符串的strcat

char * strcat ( char * destination, const char * source );

从dest的末尾 '\0'开始添加src直到'\0'

  • 源字符串必须以 '\0' 结束。

  • 目标空间必须有足够的大,能容纳下源字符串的内容。

  • 目标空间必须可修改。

模拟实现strcat

char* my_strcat(const char* str1, const char* str2){   while (*str1) str1++;  while (*(char*)str1++ = *(char*)str2++) {   ;  }}

5.查找字符串函数的strstr

char * strstr ( const char *str2, const char * str1);

在str2中查找str1的字符串,如果找到了返回str2中这个字符串的首地址。如果找不到返回NULL。.0

char* my_strstr(const char* str1, const char* str2){ if (!*str2)//判断字符串是否为空  return (char*)str1;  char* ret1= (char*)str1;//将str类型转换    char *cp = ret1; while (*ret1) {  cp = ret1;  char* ret2 =(char*) str2;  while (*cp== *str2) {//遍历字符串                if (!*ret2)//判断str2是否到达'0'的位置      return cp;     cp++, ret2++;  }  ret1++;//循环结束没有返回,从下一个字符开始查找  if (!*ret1)   return NULL; } return NULL;}

二、内存函数

1.复制 memcpy,memmove

void * memcpy ( void * destination, const void * source, size_t num );

dest复制src中num个字节的数据。

模拟实现memcpy

void * my_memcpy ( void * dst, const void * src, size_t count){  void * ret = dst;  while (count--) {    *(char *)dst = *(char *)src;    dst = (char *)dst + 1;    src = (char *)src + 1;  }   return(ret);}

·如果dst 和src指向同一个数组会发生什么?

int main(){ int arr1[10] = { 1,2,3,4,5,6,7,8,9,0 }; // 预期结果       1 2 1 2 3 4 7 8 9 0 my_memcpy(arr1+2, arr1, 16);  for (int i = 0; i < 10; i++)  {   printf("%d ", arr1[i]); }}

实际为 1 2 1 2 1 2 7 8 9 0
因为到5 6 的时候3 4被改成了1 2 ,5 6也就被改成1 2。
也就是说被复制的元素在复制前被改变了,导致复制结果失败。
如果是这样指向同一个数组呢?

int main(){   int arr1[10] = { 1,2,3,4,5,6,7,8,9,0 };   my_memcpy(arr1, arr1+2, 16);    for (int i = 0; i < 10; i++)    {     printf("%d ", arr1[i]);   }}

复制结果没有问题。

对于这种情况,c语言有一个更强大的函数memmove.

void * memmove( void * destination, const void * source, size_t num );

  • 与memcpy的功能一样,但是memmove可以指向同一块空间。

模拟实现memmove

**void* my_memmove(void* dest, void* src, size_t num){ char* ret = dest; //如果指向同一块空间 判断地址大小,避免数据在被复制前被改变 if ( (char*)dest-(char*)src< 0){  while (num)  {   *((char*)dest)++ = *((char*)src)++;   num--;  } } else {  while(num--){   *((char*)dest+num) = *((char*)src+num);  } } return ret;}

2.比较 memcmp

int memcmp ( const void * ptr1, const void * ptr2, size_t num );

从ptr1和ptr2的位置开始比较num个字节,当两个字节数据不同时就会返回。

  • ptr1>ptr2 返回值>0;

  • ptr1=ptr2 返回值=0;

  • ptr1

以上是"c语言中字符串与内存函数有哪些"这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注行业资讯频道!

字符 字符串 函数 指向 空间 目标 内存 语言 内容 位置 字节 数字 数据 篇文章 结果 两个 地址 大小 拷贝 数组 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 小米移动互联网科技园 科技赋能下的互联网金融 互联网是不是新科技 科技互联网公司装修 智能科技公司是互联网公司吗 齐家互联网科技 小马过河互联网科技 湖南洣水互联网科技有限公司扣款 广州恒生互联网科技有限 来此购互联网科技有限公司 互联网金融中的现代科技 中国互联网十大科技股排名 美国互联网科技实力 高科技互联网套路 互联网第三次科技革命特征 浙南科技城互联网大厦招聘 下一代互联网重大应用科技园 北京互联网科技类企业分布 科技互联网专业工作会议发言稿 广东猫王互联网科技有限公司电话 互联网金融监管科技数据 碳银互联网科技 互联网科技logo设计 掌上梦互联网科技 撒么互联网科技公司 恒生科技互联网指数分析 须眉科技是互联网公司吗 长沙互联网科技 广州千川互联网科技有限公司 长沙渺峰互联网科技有限公司
0