各种C语言处理函数 strcat,strcpy,strncpy,memset,memcpy 总结

2024-05-29 18:32

本文主要是介绍各种C语言处理函数 strcat,strcpy,strncpy,memset,memcpy 总结,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

    这篇文章对几个常用C语言处理函数总结一下。

1. strcat

头文件:#include <string.h>

用法:函数原型如下

char *strcat(char *dst, char const *src);

    strcat 函数要求 dst 参数原先已经包含了一个字符串(可以是空字符串)。它找到这个字符串的末尾,并把 src 字符串的一份拷贝添加到这个位置。如果 src 和 dst 的位置发生重叠,其结果是未定义的。编程者需要保证目标字符数组剩余的空间足以保存整个字符串。

实现代码

char *strcat (char * dst, const char * src)
{assert(NULL != dst && NULL != src);   // 源码里没有断言检测char * cp = dst;while(*cp )cp++;                      /* find end of dst */while(*cp++ = *src++) ;         /* Copy src to end of dst */return( dst );                  /* return dst */
}

2. strcpy

头文件:#include <string.h>

用法:strcpy 的函数原型如下:

char *strcpy(char *dst, const char *src);

函数把参数 src 字符串复制到 dst 参数,dst 字符串的结束符也会复制,如果参数 src 和 dst 在内存中出现叠,其结果是未定义的。由于 dst 参数将进行修改,所以它必须是个字符串数组或者是一个指向动态内存分配的数组指针,不能使用字符串常量。

    需要注意的是:程序员必须保证目标字符串数组的空间足以容纳需要复制的字符串。如果多余的字符串比数组长,多余的字符仍被复制,它们将覆盖原先存储于数组后面的内存空间。

实现代码:

char *strcpy(char *dst, const char *src)    // 实现src到dst的复制
{if(dst == src) return dst;              //源码中没有此项assert((dst != NULL) && (src != NULL)); //源码没有此项检查,判断参数src和dst的有效性char *cp = dst;                         //保存目标字符串的首地址while (*cp++ = *src++);                 //把src字符串的内容复制到dst下return dst;
}

3. memcpy

头文件:#include <string.h>

用法:memcpy 提供了一般内存的复制,即 memcpy 对于需要复制的内容没有限制,用途更广泛。

void *memcpy(void *dst, const void *src, size_t length);

从 src 所指的内存地址的起始位置开始,拷贝n个字节的数据到 dest 所指的内存地址的起始位置。你可以用这种方法复制任何类型的值(例如:int,double,结构或结构数组),如果src和dst以任何形式出现了重叠,它的结果将是未定义的。

实现代码:

void *memcpy(void *dst, const void *src, size_t length)
{assert((dst != NULL) && (src != NULL));char *tempSrc= (char *)src;            //保存src首地址char *tempDst = (char *)dst;           //保存dst首地址while(length-- > 0)                    //循环length次,复制src的值到dst中*tempDst++ = *tempSrc++ ;return dst;
}

strcpy 和 memcpy 的主要区别:

  • 复制的内容不同。strcpy 只能复制字符串,而 memcpy 可以复制任意内容,例如字符数组、整型、结构体、类等。
  • 复制的方法不同。strcpy 不需要指定长度,它遇到被复制字符的串结束符"\0"才结束,所以容易溢出。memcpy 则是根据其第3个参数决定复制的长度,遇到'\0'并不结束。
  • 用途不同。通常在复制字符串时用 strcpy,而需要复制其他类型数据时则一般用 memcpy;

4. strncpy

头文件:#include <string.h>

函数原型如下:

char *strncpy(char *dst, char const *src, size_t len);

strncpy 把源字符串的字符复制到目标数组,它总是正好向 dst 写入 len 个字符。如果 strlen(src) 的值小于 len,dst 数组就用额外的 NUL 字节填充到 len 长度。如果 strlen(src)的值大于或等于 len,那么只有 len 个字符被复制到dst中。这里需要注意它的结果将不会以NUL字节结尾。

实现代码:

char *strncpy(char *dst, const char *src, size_t len)
{assert(dst != NULL && src != NULL);     //源码没有此项char *cp = dst;while (len-- > 0 && *src != '\0')*cp++ = *src++;*cp = '\0';                             //源码没有此项return dst;
}

5. memset

头文件:#include <string.h>

函数原型如下:

void *memset(void *a, int ch, size_t length);

将参数a所指的内存区域前length个字节以参数ch填入,然后返回指向a的指针。在编写程序的时候,若需要将某一数组作初始化,memset()会很方便。

实现代码:

void *memset(void *a, int ch, size_t length)     
{     assert(a != NULL);     void *s = a;     while (length--)     {     *(char *)s = (char) ch;     s = (char *)s + 1;     }     return a;     
}

这篇关于各种C语言处理函数 strcat,strcpy,strncpy,memset,memcpy 总结的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1014307

相关文章

C# List.Sort四种重载总结

《C#List.Sort四种重载总结》本文详细分析了C#中List.Sort()方法的四种重载形式及其实现原理,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友... 目录1. Sort方法的四种重载2. 具体使用- List.Sort();- IComparable

SpringBoot项目整合Netty启动失败的常见错误总结

《SpringBoot项目整合Netty启动失败的常见错误总结》本文总结了SpringBoot集成Netty时常见的8类问题及解决方案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参... 目录一、端口冲突问题1. Tomcat与Netty端口冲突二、主线程被阻塞问题1. Netty启动阻

C语言逗号运算符和逗号表达式的使用小结

《C语言逗号运算符和逗号表达式的使用小结》本文详细介绍了C语言中的逗号运算符和逗号表达式,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习... 在C语言中逗号“,”也是一种运算符,称为逗号运算符。 其功能是把两个表达式连接其一般形式为:表达

Go语言实现桥接模式

《Go语言实现桥接模式》桥接模式是一种结构型设计模式,它将抽象部分与实现部分分离,使它们可以独立地变化,本文就来介绍一下了Go语言实现桥接模式,感兴趣的可以了解一下... 目录简介核心概念为什么使用桥接模式?应用场景案例分析步骤一:定义实现接口步骤二:创建具体实现类步骤三:定义抽象类步骤四:创建扩展抽象类步

GO语言实现串口简单通讯

《GO语言实现串口简单通讯》本文分享了使用Go语言进行串口通讯的实践过程,详细介绍了串口配置、数据发送与接收的代码实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要... 目录背景串口通讯代码代码块分解解析完整代码运行结果背景最近再学习 go 语言,在某宝用5块钱买了个

SpringBoot整合Kafka启动失败的常见错误问题总结(推荐)

《SpringBoot整合Kafka启动失败的常见错误问题总结(推荐)》本文总结了SpringBoot项目整合Kafka启动失败的常见错误,包括Kafka服务器连接问题、序列化配置错误、依赖配置问题、... 目录一、Kafka服务器连接问题1. Kafka服务器无法连接2. 开发环境与生产环境网络不通二、序

python3中正则表达式处理函数用法总结

《python3中正则表达式处理函数用法总结》Python中的正则表达式是一个强大的文本处理工具,用于匹配、查找、替换等操作,在Python中正则表达式的操作主要通过内置的re模块来实现,这篇文章主要... 目录前言re.match函数re.search方法re.match 与 re.search的区别检索

GO语言zap日志库理解和使用方法示例

《GO语言zap日志库理解和使用方法示例》Zap是一个高性能、结构化日志库,专为Go语言设计,它由Uber开源,并且在Go社区中非常受欢迎,:本文主要介绍GO语言zap日志库理解和使用方法的相关资... 目录1. zap日志库介绍2.安装zap库3.配置日志记录器3.1 Logger3.2 Sugared

Go语言中如何进行数据库查询操作

《Go语言中如何进行数据库查询操作》在Go语言中,与数据库交互通常通过使用数据库驱动来实现,Go语言支持多种数据库,如MySQL、PostgreSQL、SQLite等,每种数据库都有其对应的官方或第三... 查询函数QueryRow和Query详细对比特性QueryRowQuery返回值数量1个:*sql

GO语言中gox交叉编译的实现

《GO语言中gox交叉编译的实现》本文主要介绍了GO语言中gox交叉编译的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录一、安装二、使用三、遇到的问题1、开启CGO2、修改环境变量最近在工作中使用GO语言进行编码开发,因