【C库函数】strcpy函数详解

简介: 拷贝字符串到目标地址

strcpy

拷贝字符串到目标地址

1a3992c78a6cbd0a8b8ce6437a0f4fb0_watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5aiB5aiB5rKB5rKB,size_20,color_FFFFFF,t_70,g_se,x_16.png

函数原型

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


参数讲解


1a3992c78a6cbd0a8b8ce6437a0f4fb0_watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5aiB5aiB5rKB5rKB,size_20,color_FFFFFF,t_70,g_se,x_16.png1a3992c78a6cbd0a8b8ce6437a0f4fb0_watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5aiB5aiB5rKB5rKB,size_20,color_FFFFFF,t_70,g_se,x_16.png

参数 destination source
解释 目标字符串地址 以 Null 结尾的源字符串地址

返回值详解

这些函数中的每一个都返回目标字符串,没有返回值就是拷贝失败。


函数详解

       strcpy使用时几个注意点

第一个注意点:源字符串必须以‘\0’结束,同时会将源字符串中的‘\0’拷贝到目标空间。

就是说当我们把源字符串拷贝到目标地址时什么时候停止呢,就是当把源字符串中的‘\0’也拷贝过去时结束。


用以下代码为例,就是说当arr2中f拷贝到arr1中时,strcpy还会把arr2中的‘\0’拷贝到arr1中

#include<stdio.h>
#include<string.h>
int main()
{
  char arr1[8];
  char arr2[] = "abcdef";
  strcpy(arr1, arr2);
  printf("%s\n", arr1);
  return 0;
}

35302758d2d35702b617628ca90d782d_watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5aiB5aiB5rKB5rKB,size_20,color_FFFFFF,t_70,g_se,x_16.png

而如果arr2中没有‘\0’时,看如下图片所示,strcpy会越界访问直到程序崩溃!


而当给arr2中添加'\0'时,程序就很容易就编译过去了

33dda26d1ce2529f2cf7ef197c589a85_watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5aiB5aiB5rKB5rKB,size_20,color_FFFFFF,t_70,g_se,x_16.png

所以在源地址中一定要存在'\0'


第二个注意点:目标空间必须足够大,以确保能存放源字符串

假如我们把arr2中的七个字符拷贝到arr1中去,遗憾的是arr1只有四个空间不够大,这时我们还调用strcpy,就会发现程序崩了!

efe1d3622263547969f276943d18c68d_watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5aiB5aiB5rKB5rKB,size_20,color_FFFFFF,t_70,g_se,x_16.png

为什么程序会崩了呢?原因很简单,就是‘装不下’,arr1的栈空间被破坏了。


而作为程序员的我们,必须保证目标空间足够大,strcpy本身是不考虑这些问题的(很滑稽是不是,有一种你叫我干啥我干啥,出事了还怪我喽的味道)


第三个注意点:目标空间必须可变

例如下面这个代码,arr1指向"qwertyuiop"(这个字符串足够长吧),现在要求把arr2中的字符串拷贝到arr1中去,大家觉得结果会是什么?


#include<stdio.h>
#include<string.h>
int main()
{
  char* arr1 = "qwertyuiop";
  char arr2[] = "abcedf";
  strcpy(arr1, arr2);
  printf("%s", arr1);
  return 0;
}

看到这想必大家心理应该都有答案了,调试一下发现程序又崩了!这是为什么呢?

就是因为arr1指向的是常量字符串,常量是不可修改的。如果非要写成代码去修改它,抱歉只能报错了。所以大家使用strcpy是目的地必须是可修改的。

0bcdb0383e0f8fd7c5d27b56f1e28ea5_watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5aiB5aiB5rKB5rKB,size_20,color_FFFFFF,t_70,g_se,x_16.png

相关文章
|
1月前
|
安全 程序员 C语言
探索C语言库函数:字符串拷贝函数strcpy
探索C语言库函数:字符串拷贝函数strcpy
27 0
|
1月前
|
安全 C语言
【C语言】strcpy与strncpy函数的使用和模拟实现
【C语言】strcpy与strncpy函数的使用和模拟实现
9 0
|
1月前
|
编译器 C语言 C++
【C语言】strcpy()函数(字符串拷贝函数详解)
【C语言】strcpy()函数(字符串拷贝函数详解)
77 1
|
1月前
|
安全 程序员 C语言
探索C语言库函数:字符串拷贝函数strcpy()
探索C语言库函数:字符串拷贝函数strcpy()
12 0
|
9月前
|
C语言
C语言:字符串拷贝函数strcpy()
将 字符串1 的内容拷贝到 字符串2 中:strcpy(arr1,arr2) 注意:1.字符串1 的长度需要大于 字符串2 的长度(否则程序报错) 2.拷贝时会连同 ‘ \0 ’ 一起拷贝,字符串1 前面的内容会被覆盖,后面的内容不会被覆盖仍然存在,由于 ‘ \0 ’ 的存在,打印室并不会打印后面的内容
53 0
|
11月前
|
C语言
strcat函数和strncat函数--【C语言】
strcat函数和strncat函数--【C语言】
|
11月前
|
程序员 C语言
C语言实现strcpy函数和strlen函数
在操作字符串的函数大块中,其中有两个函数分别是strcpy和strlen函数,他们都是在#include<string.h>中包含。strcpy函数可以将一个字符数组的内容放到另一个字符数组中,实现字符串拷贝,而strlen函数是求一组字符串的长度的函数。他们都由C库提供,方便程序员使用。
65 0
|
11月前
|
C语言
strcmp函数和strncmp函数【C语言】
strcmp函数和strncmp函数【C语言】
|
编译器 C语言
C语言strlen,strcpy ,strcat, strcmp,strstr常用库函数的理解与模拟实现
C语言strlen,strcpy ,strcat, strcmp,strstr常用库函数的理解与模拟实现
108 0
|
C语言
c语言 字符串操作函数 strcpy, strcat, strcmp, strlen.
字符串操作函数是用于操作字符串的。有的函数有新版和旧版,大同小异。字符串操作函数的头文件: string.h
91 0