C语言中strcpy()函数的具体实现及注意事项

 更新时间:2022年11月30日 11:14:59   作者:Candysrf  
C语言库函数char *strcpy(char *dest, const char *src)把src所指向的字符串复制到dest,下面这篇文章主要给大家介绍了关于C语言中strcpy()函数的具体实现及注意事项的相关资料,需要的朋友可以参考下

一、strcpy()函数的简介

 strcpy()函数:是将一个字符串复制到另一块空间地址中 的函数,‘\0’是停止拷贝的终止条件,同时也会将 '\0' 也复制到目标空间。下面是库中的strcpy()函数声明:

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

1. 函数的参数:

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

2.函数的返回值类型:

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

二、strcpy()函数的具体使用

场景一:

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

 输出的结果

场景二: 

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

输出结果

三、使用strcpy()函数的注意事项

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

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

这里的代码会出错,'\0'是停止拷贝的终止条件,arr2字符数组所在的内存空间后面存储的内容并不知道,不遇到 '\0' 拷贝就不会停止,这就会导致越界访问,程序就会出现问题。

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

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

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

3.目标空间必须可变

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
 
int main()
{
	char* str1 = "hello world";
	char str2[10] = "*********";
	printf("%s\n", strcpy(str1,str2));
 
	return 0;
}

这里的程序也出现了错误。str1指向的是常量字符串,是不可以被修改掉的,目标空间必须是可以被修改的,因为要将拷贝的字符串放在目标空间中。而源字符串可以是能够修改的、也可以是不能修改的,因为strcpy函数的第二个参数已经用const关键字修饰了,保证了拷贝过程中不会被修改。

补充:strcpy()的其它属性

strcpy()的返回类型是char *,该函数返回的是一个字符的地址。

第一个参数不必指向数组的开始,这个特性可用于拷贝数组的一部分。

下面这个程序演示了将一个字符串拷贝到另一个字符数组的指定位置:

/*
 * @Author: Your name
 * @Date:   2020-02-24 14:35:13
 * @Last Modified by:   Your name
 * @Last Modified time: 2020-02-24 15:26:57
 */
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define WORDS "beast"
#define SIZE 40
int main()
{
    const char * orig = WORDS;
    char copy[SIZE] = "Be the best that you can be.";
    char * ps;
    puts(orig);
    puts(copy);
    ps = strcpy(copy+7,orig);//ps==&copy[7],第八个元素的地址。
    puts(copy);
    puts(ps);
    getchar();
    return 0;
}

下面是该程序的输出:

beast
Be the best that you can be.
Be the beast
beast

注意:

  • strcpy()把源字符的空字符也拷贝进去
  • 所以空字符覆盖了copy数组中that的第一个t
  • 由于第一个参数是copy+7,所以ps指向copy中的第8个元素,因此puts(ps)从该处开始打印

具体如下:

总结

到此这篇关于C语言中strcpy()函数的具体实现及注意事项的文章就介绍到这了,更多相关C语言strcpy()函数内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • OpenCV 圆与矩形识别的方法

    OpenCV 圆与矩形识别的方法

    这篇文章主要介绍了OpenCV 圆与矩形识别的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-07-07
  • C++面试八股文之左值与右值

    C++面试八股文之左值与右值

    简单来说,左值就是可以使用&符号取地址的值,而右值一般不可以使用&符号取地址,这篇文章主要来和大家讲讲面试中左值与右值常考的知识点,需要的可以参考一下
    2023-06-06
  • C++类的返回值是*this的成员函数问题

    C++类的返回值是*this的成员函数问题

    这篇文章主要介绍了C++类的返回值是*this的成员函数问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-11-11
  • C语言类的基本语法详解

    C语言类的基本语法详解

    大家好,本篇文章主要讲的是C语言类的基本语法详解,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下,方便下次浏览
    2022-01-01
  • C语言控制台绘制曲线的实现代码

    C语言控制台绘制曲线的实现代码

    这篇文章主要为大家详细介绍了C语言控制台绘制曲线的实现代码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-06-06
  • C++中对象的动态建立与释放详解及其作用介绍

    C++中对象的动态建立与释放详解及其作用介绍

    这篇文章主要介绍了C++中对象的动态建立与释放详解及其作用介绍,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-09-09
  • C++非递归遍历磁盘文件和递归遍历磁盘文件的程序示例

    C++非递归遍历磁盘文件和递归遍历磁盘文件的程序示例

    这篇文章主要介绍了C++非递归遍历磁盘文件和递归遍历磁盘文件的程序示例,大家可以参考使用二种方法
    2013-11-11
  • Qt编写自定义控件实现抽奖转盘

    Qt编写自定义控件实现抽奖转盘

    这篇文章主要为大家详细介绍了Qt编写自定义控件实现抽奖转盘,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-06-06
  • C语言中指针 int *p=0;和int *p;*p=0;和”&“的关系和区别详解

    C语言中指针 int *p=0;和int *p;*p=0;和”&“的关系和区别详解

    这篇文章主要介绍了C语言中指针 int *p=0;和int *p;*p=0;和”&“有什么关系和区别,本文给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-02-02
  • c++中log4cplus日志库使用的基本步骤和示例代码

    c++中log4cplus日志库使用的基本步骤和示例代码

    这篇文章主要给大家介绍了关于c++中log4cplus日志库使用的相关资料,log4cplus是一款开源的c++日志库,具有线程安全,灵活,以及多粒度控制的特点,log4cplus可以将日志按照优先级进行划分,使其可以面向程序的调试,运行,测试,后期维护等软件全生命周期,需要的朋友可以参考下
    2024-06-06

最新评论