千家信息网

C语言的一些重要字符串与内存函数是怎样的

发表于:2026-11-03 作者:千家信息网编辑
千家信息网最后更新 2026年11月03日,本篇文章为大家展示了C语言的一些重要字符串与内存函数是怎样的,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。一.字符串函数1. 求字符串长度的strlensiz
千家信息网最后更新 2026年11月03日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

    与strcmp实现类似,这里就不实现了

    上述内容就是C语言的一些重要字符串与内存函数是怎样的,你们学到知识或技能了吗?如果还想学到更多技能或者丰富自己的知识储备,欢迎关注行业资讯频道。

    字符 字符串 函数 指向 空间 目标 内存 语言 位置 内容 字节 数字 数据 结果 重要 两个 地址 大小 技能 拷贝 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 广州为想互联网科技有限公司 互联网科技工作委员会主任 云信互联网科技有限公司 互联网科技会 朗新科技与工业互联网 金融科技 互联网金融 亿策互联网科技 广西互联网科技公司 互联网科技汛 海南科技产业互联网平台 以后互联网后是啥科技 互联网经济与金融科技 米聚互联网科技南京有限公司排面 互联网科技和信息 广州新华互联网科技学校电竞方面 阿里互联网科技企业 工业互联网展湾科技股份有限公司 江苏苏星互联网科技有限公司 马化腾互联网科技教学 山东蛋芒互联网科技有限公司 湖北九亚互联网络科技有限公司 涨乐互联网科技 上海喔噻互联网科技 互联网科技类展会 互联网科技股午盘股票涨跌 成都玖崟互联网科技有限公司乐商圈怎么样 农村开互联网科技讲堂 互联网科技产业特征 湖北辰鑫科技互联网 互联网科技创业有什么好项目
    0