strcpy函数与strncpy函数

简介: strcpy函数与strncpy函数

strcpy函数

一. strcpy函数的简介

下面是库中的strcpy()函数声明:

char* strcpy(char* destination,const char* source);

strcpy的功能是将一个字符串复制到另一块空间地址中 的函数,‘\0’是停止拷贝的终止条件,同时也会将 ‘\0’ 也复制到目标空间。

1. 函数的参数:

char* destination---------目标字符串的首地址

const char* source------源地址:被复制的字符串的首地址,用const修饰,避免修改掉被拷贝的字符串

2.函数的返回值类型:

char*:返回的是目标字符串的首地址

二、strcpy函数的使用

#include <stdio.h>
#include <string.h>
int main()
{
  char arr[10] = "########";
  char err[10] = "hello";
  strcpy(arr, err);
  printf("%s\n", arr);
  return 0;
}

三、strcpy函数的注意事项

1.源字符必须以 '\0’结束:

#include <stdio.h>
#include <string.h>
int main()
{
  char arr[10] = "##########";
  char err[] = { 'a','b','c','d' };
  printf("%s\n", strcpy(arr, err));
  return 0;
}

程序报错,运行异常。因为,我们知道‘\0’是strcpy函数停止拷贝的终止条件。err字符数组所在的内存空间后面存储的内容并不知道,不遇到 ‘\0’ 拷贝就不会停止,这就会导致越界访问,程序就会出现问题。

2.目标空间必须足够大,以确保能放源字符串

#include <stdio.h>
#include <string.h>
int main()
{
  char arr[5] = "###";
  char err[] = "hello world";
  strcpy(arr, err);
  printf("%s\n", arr);
  return 0;
}

运行结果

这里虽然拷贝成功并将结果输出了,但程序却崩溃了。目标空间太小,不足以放置拷贝的源字符串,会造成溢出的情况。

3.目标空间必须可变

int main()
{
  char* p = "hello world";
  char arr[10] = "*********";
  printf("%s\n", strcpy(p, arr));
  return 0;
}

程序错误,无法复制。这是因为由char* strcpy(char* destination,const char* source);可知,也就是说它要复制的那块空间必须是可以变化的。但是,在这里p是一个指针,它指向了一个常量空间,常量空间是无法改变的。所以,程序错误。

四、strcpy函数的模拟

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <assert.h>
char* my_strcpy(char* arr, const char* err)
{ 
    assert(arr!=NULL);
    assert(err !=NULL
  char* start = arr;//保存arr的数组首地址,便于return
  //下面的部分可以写成
  //  while(*arr++ = *err++){}   //
  while (*err != '\0')//遍历err数组
  {
    *arr = *err;//解引用,将对应的元素拷贝
    arr++;//arr数组+1
    err++;//err数组+1
  }
  *arr = *err;//while循环到'\0'就结束了,所以还需要将\0赋值过去。
  return start;
}
int main()
{
  char arr[10] = "*********";
  char err[5] = "lili";
  printf("%s", my_strcpy(arr, err));
  return 0;
}

运行结果

strncpy函数

一、strncpy函数的简介

1.下面是库中的strcpy()函数声明:

char *strncpy(char *dest, const char *src, int n)

n:要拷贝的个数,即:将src中前n个字符赋值到dest中。

2.使用细节

1、当src字符串长度小于n时,则拷贝完字符串后,剩余部分将用空字节填充,直到n个

2. strncpy不会向dest追加’\0’。

二 、区别

与strcpy的区别

1、strcpy() 函数用来复制字符串;strncpy()用来复制字符串的前n个字符,所以要多传一个参数n

1)char *strcpy(char *dest, const char *src);

2)char * strncpy(char *dest, const char *src,size_t n);

2、不像strcpy(),strncpy()不会向dest追加结束标记’\0’

三、strcnpy模拟

#include <stdio.h>
#include<string.h>
#include <assert.h>
//dest为目标数组,src为源数组,n为要复制的字符个数
char* My_strncpy(char* dest, const char* src, int n)
{
  assert(dest != NULL);//保证dest非空
  assert(src != NULL); //保证src非空
  char* ret = dest;    //将dest首地址储存在ret中,在之后dest++运算中,可以方便找到
  while (n)   //一次复制一个字符,要复制n次
  {
    *dest = *src;  //复制
    src++;    //源地址往后+1
    dest++;   //目标地址往后+1
    n--;      //跳出循环条件
  }
  return ret;  //返回目的数组的首地址
}
int main()
{
  char arr1[] = "I LOVE YOU";
  char arr2[] = "SORRY";
  My_strncpy(arr1, arr2,5);
  //经过函数My_strncpy后 ,arr1里应该是字符串 SORRYE YOU
  printf("arr1: %s\n", arr1);
  return 0;
}


相关文章
|
7月前
strlen,strcpy,stract,strcmp,strstr函数的模拟实现
strlen,strcpy,stract,strcmp,strstr函数的模拟实现
66 3
|
7月前
|
C语言
字符串函数`strlen`、`strcpy`、`strcmp`、`strstr`、`strcat`的使用以及模拟实现
字符串函数`strlen`、`strcpy`、`strcmp`、`strstr`、`strcat`的使用以及模拟实现
132 1
|
2月前
解析与模拟常用字符串函数strcpy,strcat,strcmp,strstr(一)
解析与模拟常用字符串函数strcpy,strcat,strcmp,strstr(一)
42 0
|
7月前
|
存储 编译器 C语言
strlen函数详解
strlen函数详解
294 2
|
C语言
自己实现strcpy和strlen函数
自己实现strcpy和strlen函数
96 0
C实现字符操作函数,strcpy, strcat, strcmp, memcpy
C实现字符操作函数,strcpy, strcat, strcmp, memcpy
57 0
strlen, strcpy,strcmp,strcat,strncpy,strncmp,strncat,strst库函数的详细解析以及模拟实现
🐰strlen 🐰模拟strlen 🐰strcpy 🐰模拟strcpy 🐰strcat 🐰模拟strcat 🐰strcmp 🐰模拟strcmp 🐰strncpy 🐰strncat 🐰strncmp 🐰strstr 🐰模拟strstr
|
安全
strcpy和strncpy的使用以及strcpy的模拟实现(三种方法)
strcpy和strncpy的使用以及strcpy的模拟实现(三种方法)
229 0
strcpy和strncpy的使用以及strcpy的模拟实现(三种方法)