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

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

1. strcat

头文件:#include

用法:函数原型如下

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

用法: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

用法: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

函数原型如下:

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

函数原型如下:

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;     
}

你可能感兴趣的:(研究生)