memset,memcpy,strcat,strcpy,strncpy总结

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/wk_bjut_edu_cn/article/details/82467128

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

应用

#include <iostream>
#include <string.h>
using namespace std;
int main()
{
        char a[3]="my";
        char b[8]="aaaaaaa";
        memset(b,'c',3);
        cout<<b<<endl;
        return 0;
}

2.memcpy函数

头文件:

#include <string.h>

函数原型:

扫描二维码关注公众号,回复: 3307221 查看本文章
void *memcpy(void *dst, const void *src, size_t length);

函数说明

从 src 所指的内存地址的起始位置开始,拷贝length个字节的数据到 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;
}

应用:

#include <iostream>
#include <string.h>
using namespace std;
int main()
{
        char a[3]="my";
        char b[8]="aaaaaaa";
        memcpy(b,a,2);
        cout<<b<<endl;
        return 0;
}

3.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 */
}

应用:

#include <iostream>
#include <string.h>
using namespace std;
int main()
{
        char a[3]="my";
        char b[8]="aaaaaaa";
        strcat(a,b);
        cout<<a<<endl;
        return 0;
}

4.strcpy

头文件:

#include <string.h>

函数原型:

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

应用:

#include <iostream>
#include <string.h>
using namespace std;
int main()
{
        char a[3]="my";
        char b[8]="aaaaaaa";
        strcpy(b,a);
        cout<<b<<endl;
        return 0;
}

注意:这里的结果是my而不是myaaaaa,可通过看实现代码看出端倪,因为拷贝了'\0',所以终止了。

5.strncpy

头文件:

#include <string.h>

函数原型:

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

函数说明:

strncpy 把源字符串的字符复制到目标数组,它总是正好向 dst 写入 len 个字符。如果 strlen(src) 的值小于 len,dst 数组就用额外的 NUL 字节(C语言中的'\0')填充到 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;
}

猜你喜欢

转载自blog.csdn.net/wk_bjut_edu_cn/article/details/82467128
今日推荐