各种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

相关文章

使用SQL语言查询多个Excel表格的操作方法

《使用SQL语言查询多个Excel表格的操作方法》本文介绍了如何使用SQL语言查询多个Excel表格,通过将所有Excel表格放入一个.xlsx文件中,并使用pandas和pandasql库进行读取和... 目录如何用SQL语言查询多个Excel表格如何使用sql查询excel内容1. 简介2. 实现思路3

Go语言实现将中文转化为拼音功能

《Go语言实现将中文转化为拼音功能》这篇文章主要为大家详细介绍了Go语言中如何实现将中文转化为拼音功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 有这么一个需求:新用户入职 创建一系列账号比较麻烦,打算通过接口传入姓名进行初始化。想把姓名转化成拼音。因为有些账号即需要中文也需要英

Go语言使用Buffer实现高性能处理字节和字符

《Go语言使用Buffer实现高性能处理字节和字符》在Go中,bytes.Buffer是一个非常高效的类型,用于处理字节数据的读写操作,本文将详细介绍一下如何使用Buffer实现高性能处理字节和... 目录1. bytes.Buffer 的基本用法1.1. 创建和初始化 Buffer1.2. 使用 Writ

深入理解C语言的void*

《深入理解C语言的void*》本文主要介绍了C语言的void*,包括它的任意性、编译器对void*的类型检查以及需要显式类型转换的规则,具有一定的参考价值,感兴趣的可以了解一下... 目录一、void* 的类型任意性二、编译器对 void* 的类型检查三、需要显式类型转换占用的字节四、总结一、void* 的

Python中实现进度条的多种方法总结

《Python中实现进度条的多种方法总结》在Python编程中,进度条是一个非常有用的功能,它能让用户直观地了解任务的进度,提升用户体验,本文将介绍几种在Python中实现进度条的常用方法,并通过代码... 目录一、简单的打印方式二、使用tqdm库三、使用alive-progress库四、使用progres

Android数据库Room的实际使用过程总结

《Android数据库Room的实际使用过程总结》这篇文章主要给大家介绍了关于Android数据库Room的实际使用过程,详细介绍了如何创建实体类、数据访问对象(DAO)和数据库抽象类,需要的朋友可以... 目录前言一、Room的基本使用1.项目配置2.创建实体类(Entity)3.创建数据访问对象(DAO

C语言线程池的常见实现方式详解

《C语言线程池的常见实现方式详解》本文介绍了如何使用C语言实现一个基本的线程池,线程池的实现包括工作线程、任务队列、任务调度、线程池的初始化、任务添加、销毁等步骤,感兴趣的朋友跟随小编一起看看吧... 目录1. 线程池的基本结构2. 线程池的实现步骤3. 线程池的核心数据结构4. 线程池的详细实现4.1 初

Java向kettle8.0传递参数的方式总结

《Java向kettle8.0传递参数的方式总结》介绍了如何在Kettle中传递参数到转换和作业中,包括设置全局properties、使用TransMeta和JobMeta的parameterValu... 目录1.传递参数到转换中2.传递参数到作业中总结1.传递参数到转换中1.1. 通过设置Trans的

C# Task Cancellation使用总结

《C#TaskCancellation使用总结》本文主要介绍了在使用CancellationTokenSource取消任务时的行为,以及如何使用Task的ContinueWith方法来处理任务的延... 目录C# Task Cancellation总结1、调用cancellationTokenSource.

HarmonyOS学习(七)——UI(五)常用布局总结

自适应布局 1.1、线性布局(LinearLayout) 通过线性容器Row和Column实现线性布局。Column容器内的子组件按照垂直方向排列,Row组件中的子组件按照水平方向排列。 属性说明space通过space参数设置主轴上子组件的间距,达到各子组件在排列上的等间距效果alignItems设置子组件在交叉轴上的对齐方式,且在各类尺寸屏幕上表现一致,其中交叉轴为垂直时,取值为Vert