为什么要用strcpy给字符串赋值 C语言中怎么字符串赋值?

C语言中怎么字符串赋值?

为什么要用strcpy给字符串赋值 C语言中怎么字符串赋值?

需要准备的材料有:计算机和C语言编译器。

1.首先,打开C语言编译器并创建一个初始。cpp文件,例如test.cpp。

2.在test.cpp文件中,输入C语言代码:char a[20]strcpy(a,

strcpy是什么意思?

C语言的标准库函数Strcpy,将从src地址开始并包含空终止符的字符串复制到从dest开始的地址空间。直观表示为strcpy (dog,赋值内容),实现了字变量dog的赋值,区别于普通数字。原型声明:externchar * strcpy (char * dest,const char * src);头文件:#includ

strcpy函数怎么用?

首先,使用步骤如下

1.头文件:#include ltstring.hgt和# includelstdio.hgt。

2.功能:将从src地址开始并包含空终止符的字符串复制到从dest开始的地址空间。

3.描述:src和dest指示的内存区域不能重叠,dest必须有足够的空间来容纳src字符串。返回一个指向目标的指针。

第二,拓展

//C语言标准库函数strcpy的典型工业最简单实现。

//返回值:目标字符串的地址。

//参数:des是目标字符串,source是原始字符串。

char* strcpy(char* des,const char* source) {

char* rdes

断言((des!NULL) ampamp(来源!NULL))

while((*r *source)!#390#39)

返回des

}

//while((* des * source))的解释:赋值表达式返回左操作数,所以在赋值#390#39之后,循环停止。

例如:

char a[10],b[]{#34COPY#34}

//定义字符数组a,b

strcpy(a,b)

//将副本从B复制到a。

Strcpy函数中的缓冲区溢出及其防范

C语言和C语言以其轻松灵活的风格和宽松的语法限制,受到各类程序员的欢迎。它们是比较常见的编程语言,也是各大高校计算机专业的基础语言课程。Strcpy函数由于不检查数组边界,非常容易造成各种缓冲区溢出漏洞。这些漏洞很容易被利用,导致严重的系统问题。使用strcpy函数,要小心。Strcpy函数中的缓冲区溢出及其预防措施将在下面讨论。[1]

缓冲区溢出问题

缓冲区溢出是指程序在动态分配的缓冲区中写入了过多的数据,使得分配的区域溢出。一旦一个缓冲区可以通过使用程序把运行指令放到root权限的内存中,并运行这些指令,就可以用root权限控制计算机了。[1]

Strcpy函数的安全编码

编程时,通过增加错误检查,可以及时发现错误,处理出现的异常。写strcpy函数时,先把目的缓冲区的长度做得尽可能长,然后检查目的缓冲区和源缓冲区。如果目标缓冲区或源缓冲区为空,程序将在异常处理中结束。如果源字符串不长于目标缓冲区,还应该在异常处理中结束程序,以防止溢出。任何程序都很难说是绝对安全的,strcpy函数只能以最安全的处理。只要输入字符串不以空字符结尾,该函数将随时终止。这种检测很容易实现。然而,这种检测并不能确保该功能一定是安全的。[1]

另外,每增加一个错误检查,都会让程序更加复杂,可能会产生很多bug,增加很多工作量。最重要的是,即使程序设计得非常仔细,也可能会忽略一些细节,导致不可挽回的错误。所以写程序的时候,最保险的办法就是尽量不要用strcpy函数。可以在程序开头添加#define strcpy Unsafe_strcpy。这样strcpy函数在编译时就会产生错误,这样我们在编程时就可以完全抛弃strcpy函数了。当strcpy函数被完全抛弃后,很多依附于strcpy函数的bug也被抛弃。[1]

特殊情况描述

已知strcpy函数的原型是:

char * strcpy(char * strDest,const char * strSrc)

1.不调用库函数实现strcpy函数。

2.解释为什么要返回char *。

不调用库函数如何实现strcpy函数

strcpy的实现代码

char * strcpy(char * strDest,const char * strSrc){

if((NULLstrDest)| |(nullstrrc))

//[1]

抛出#34无效参数# 34

//[2]

char * strDestCopy strDest

//[3]

瓦特小时ile ((*strDest *strSrc)!#390#39)

//[4]

返回strDestCopy

}

错误做法[1]:

(a)不检查指针的有效性意味着回答者不注意代码的健壮性。

使用((!strDest)||(!StrSrc))或(!(strDestampampstrSrc)),说明回答者对C语言中类型的隐式转换没有深刻的理解。在这种情况下,从char *到bool的转换是隐式类型转换。这个功能虽然灵活,但是会导致出错概率更大,维护成本更高。所以C特别添加了bool,true和false关键字,提供了一个更安全的条件表达式。

(c)在检查指针的有效性时使用((strdest0) || (strrc0)),表示回答者不知道使用常数的好处。直接使用文字常量(比如本例中的0)会降低程序的可维护性。虽然0很简单,但是程序中可能会有很多对指针的检查。万一出现笔误,编译器可以 t找不到,生成的程序包含逻辑错误,很难消除。用NULL代替0,如果有拼写错误,编译器会检查出来。

错误的[2]:

(A)返回新字符串(#34无效参数# 34);说明回答者对返回值的用途没有概念,对内存泄漏没有警觉。从函数中返回分配在函数体中的内存是非常危险的。他把释放记忆的义务扔给了毫无戒心的呼叫者。在大多数情况下,调用者不会释放内存,从而导致内存泄漏。

(B)返回0;,说明回答者没有掌握异常机制。调用者可能忘记检查返回值,调用者可能无法检查返回值(见下面的链式表达式)。如果想让返回值肩负起返回正确值和异常值的双重功能,结果往往是两个功能都无效。返回值应该用抛出异常来代替,这样可以减轻调用者的负担,使错误不被忽略,增强程序的可维护性。

错误的[3]:

(一)忘记保存原始strDest值,说明回答者逻辑思维不严谨。

错误的[4]:

(a)将循环写成while(* strtest copy * str src);,同[1](B)。

(b)循环被写成while(* str RC!# 390 # 39)* str dest * str src;,表明被告 对边界条件的检查是薄弱的。在循环体结束后,strDest字符串的末尾没有正确添加#390#39。

解释为什么要返回char *

返回strDest的原始值以生成函数它可以支持链表达式并增加 "附加值和利润的功能。功能相同的功能,如果可用性能得到合理提升,自然更理想。

链表达式的形式如下:

int iLengthstrlen(strcpy(strA,strB))

另一个例子是:

char * strAstrcpy(新char[10],strB)

返回strSrc的原始值是错误的。第一,源字符串必须是已知的,返回没有意义。第二,不能支持第二个例子那样的表达式。第三,为了保护源字符串,形参使用const限制strSrc引用的内容,返回const char *作为char *。类型不匹配,编译器报告错误。

在上面的语句中,循环语句

while ((*strDestCopy *strSrc)!#390#39)

很难理解,这句话可以理解为下面的操作。

第一种:

while( 1 ){

炭化温度

*strDestCopy *strSrc

温度* strSrc

strDestCopy

strSrc

如果(#390#39温度)

破裂

}

第二种类型:

while(* strrc!#390#39 ){

*strDestCopy *strSrc

strDestCopy

strSrc

}

*strDestCopy *strSrc

即:

while(* strrc!#390#39 ){

*strDestCopy *strSrc

}

* strDestCopy“0”

使用示例

//例1:将一个字符串复制到一个足够长的字符数组中。在本例中,字符数组是一个,长度为20。

//缺点:如果数组长度不足以容纳整个字符串,程序会崩溃。

#includeltiostreamgt

#includeltstdlib.hgt

使用命名空间标准

char * strcpy( char * strDest,const char * strSrc ){

char * strDestCopy strDest

if((NULLstrDest)| |(nullstrrc))抛出#34无效参数# 34

while ( (*strDest *strSrc)!#390#39 )

返回strDestCopy

}

int main( int argc,char * argv[] ){

char a[20],c[]# 34我是老师!#34

尝试{

strcpy(a,c)

}catch(char* strInfo){

cout ltlt strInfo ltlt endl

退出(-1)

}

cout ltlt a ltlt endl

返回0

}

//例2:预置了两个字符指针,一个指向字符串,一个指向NULL,在程序运行过程中复制。

#includeltiostreamgt

使用命名空间标准

char *strcpy(char *strDes,const char *strSrc)

//函数声明

int main(){

const char * strrc # 34 hello world # 34

char *strDesNULL

strDesstrcpy(strDes,strSrc)

cout ltlt # 34 strsrc # 34 ltlstrsrcltltendl

coultlt # 34 strdes # 34 ltltstrdestltendl

如果(strDes!NULL) {

免费(strDes)

strDesNULL

}

返回0

}

char *strcpy(char *strDes,const char *strSrc){

断言(strSrc!空)

//如果strSrc为NULL,则引发异常。

strDes(char *)malloc(strlen(str src)1)

//多一个空间用于存储字符串终止符#390#39。

char *pstrDes

while(* strrc!#390#39){

* p * strSrc

}

*p#390#39

返回strDes

}

还有一个模拟算法:

char * strcpy(char *dest,const char *src){

char *pdest

while (*src!#390#39){

*dest *src

目标服务中心

}

*目的地#390#39

返回p

}

与strncpy的区别

第一种情况:

你好吗?#34

字符ame[20]34 abcdefghijklmnopqrs # 34

strcpy(名称,p)

//名字改成# 34你好吗?#34gt正确!

strncpy(name,p,sizeof(name))

//名字改成# 34你好吗?#34 gt正确!后续字符将为空。

第二种情况:

你好吗?#34

字符名称[10]

strcpy(名称,p)

//目标字符串的长度小于源字符串的长度,错误!

名称[sizeof(name)-1]

//和上一步结合起来弥补结果,但这是不可取的,因为上一步的错误处理方法是不确定的。

strncpy(name,p,sizeof(name))

//源字符串的长度大于指定副本sizeof(name)的长度。请注意,在这种情况下,#390#39不会自动添加到目标字符串之后。

名称[sizeof(name)-1]

标签:

最新文章

  1. 芜湖哪有粽叶 粽叶一年四季有卖吗?2025-03-22
  2. 如何设置Windows 7讲述人的语音音调2025-03-11
  3. 什么压缩软件最方便 最方便的压缩软件推荐及详细使用指南2025-03-13
  4. seo怎么做 seo那些技术是必须要学习的?2025-03-28
  5. 苹果手机如何把所有照片都加密 苹果手机怎么把照片隐藏?2025-03-10
  6. 如何在微信上做小程序2025-03-15
  7. 美团优选买菜可以用消费券吗 下载美团优选有危害吗?2025-03-12
  8. 如何在Blender中找到“拆分非平面”功能2025-03-10
  9. unity指定文件路径 unity保存步骤?2025-03-31
  10. 什么软件可以直接转移相片2025-03-12
  11. 如何删掉微信朋友圈所有的内容2025-03-13
  12. 截尾取整是什么意思 excel中取整函数是如何实现的?2025-03-27
  13. 如何在Win7系统中打开放大镜功能?2025-03-08
  14. 微信转账到账时间设置指南2025-03-06
  15. seo技术 今天面试SEO,面试官问网站排名和关键词排名,有什么异同?2025-03-28
  16. Excel函数的应用2025-03-07
  17. jquery筛选器使用说明 jquery中如何获取当前DOM对象里的子元素?2025-03-25
  18. 铭瑄电竞之心怎样(铭瑄电竞之心显卡是什么级别?)2025-03-17
  19. websphere和was区别 websphere和tomcat区别?2025-04-01
  20. 企业邮箱注册 企业邮箱怎么登陆?2025-03-23
  21. 微信名片怎么推荐给朋友 徽信里怎么把朋友推荐给他人?2025-03-10
  22. 股权架构设计方案图 门户网站的技术架构怎样设计方案?2025-03-30
  23. 云美摄视频制作软件 美摄视频怎么下载到抖音?2025-04-02
  24. 文件中的unicode码怎么删除 ans可以删吗?2025-03-14
  25. 5G对网络营销的影响分析 网络营销给传统营销带来哪些冲击?2025-03-21
  26. 电脑bios恢复出厂设置 我的华硕主板bios没有南桥芯片设置啊?2025-03-27
  27. 被移出群聊怎么重新回到群2025-03-13
  28. html网页设计素材 自学设计有哪些好用的网站?2025-03-31
  29. 室内设计灵感来源 每次设计的灵感都是怎么找到的?2025-03-28
  30. 永久修改电脑配置 订车后车子到了没提车还可以换车换配置吗?2025-03-16
优质自媒体
优质自媒体 微信号:优质自媒体 扫描二维码关注公众号
优质自媒体

小编推荐

  1. 1 天猫账号进入后台需要验证怎么办 天猫买家也要实名认证吗?

    天猫买家也要实名认证吗?是的,天猫买家也必须实名认证,得象淘宝和支付宝差不多都不需要实名认证。见意开通支付宝,况且卖家接受,可是在用,不实际支付宝,后期的权益就没法保障。支付宝的认证我还是很简单啊的。是需要必须有身份证,和用身份证办理的银行

  2. 2 我的世界南瓜派怎么获得(mc南瓜派怎么做?)

    我的世界南瓜派指令?1.我的世界南瓜饼是无法通过命令生成的,而是玩家通过一些素材合成的。2.合成方法:一个南瓜派的合成是由一个鸡蛋、一颗糖和一个南瓜放在工作台或文章栏的合成台上。合成方法是随意放鸡蛋,南瓜,糖。3.交易农民和村民出售2-3个

  3. 3 酒店电热水壶多少钱(一个一般的电热水壶多少钱?)

    电热水壶价格多少钱?的容量方面,塑料盖普遍便宜,1.2的40多,不锈钢盖贵一些,100,1.8L半球牌电水壶价格是多少?还可以,价格几十到几百不等。Yd-15k半球形电热水壶是在多年经验的基础上精心研制而成。具有独特的自动控制,热效率高,使

  4. 4 北京有几个火车站(北京六个火车站?)

    北京六个火车站?是的,北京目前有六个火车站,分别是北京站(北京站)、北京北站、北京南站、北京朝阳站、北京西站、顺义站。北京站位于北京市东城区,二环以内,建国门和东便门以西,崇文门和东便门之间,北京原内城墙以北,东长安街以南。北京北站位于北京

  5. 5 笔记本电脑键盘贴纸怎么去掉 怎么去掉笔记本键盘上的贴纸?

    怎么去掉笔记本键盘上的贴纸?1.用温水冲洗掉键盘薄膜上的灰尘。2.取一定量的温水,将键盘膜浸泡其中,取一定量的牙膏,用手或牙刷在键盘膜上均匀拍打。3.用清水冲洗2至3次,以洗掉泡沫。这时候可以检查一下,看看哪里还有不干净的地方,然后再清洗。

  6. 6 如何打开隐藏文件夹 电脑里隐藏的文件夹怎么找回来?

    怎样显示隐藏的文件夹?1.打开隐藏文件夹所在的文件夹;2.点击查看,勾选屏幕上的隐藏项,隐藏的文件夹就会显示出来;3.如果需要取消隐藏文件,选择隐藏的文件夹后点击查看,取消选择隐藏选中的项目;4.取消查看选项中的隐藏项目,文件夹将再次隐藏。

  7. 7 吊顶安装教程 萤石c2c如何安装?

    萤石c2c如何安装?如果您找不到WiFi,请检查如下:首先,您可以在设备管理器中找到硬件。其次,在设备管理器中找到硬件后,显示的驱动程序正常。如果设备显示正常,驱动程序正常,无线路由器正常,系统正常,需要查找无线网卡本身的问题,需要下载驱动

  8. 8 照片配电影字幕软件是什么 p图能打上电影文字的叫什么软件?

    p图能打上电影文字的叫什么软件?teorex(把图上的小瑕疵圈上,就是可以一键去除,祛除之后自动输入的一般背景几乎看不出有改的一点痕迹。也可以利用能去掉偷影的人,可以去掉表面的文字等等)p出逼格意韵的话,前好一阵子很流行filmora是什么

  9. 9 揭秘苹果手机十大冷知识 二手 iPhone 值得买吗?

    二手 iPhone 值得买吗?二手苹果手机真心买,是需要你要考虑他有没有什么隐藏的问题,假如本身质量没有问题,二手手机值得去爱网上购买。视频程序...iphone124款有什么区别?简单的方法是屏幕尺寸机身大小上的区别,iPhone12 m

  10. 10 电脑图片怎么打印到a4纸上 用什么方法可以快速使图片打印出来为A4纸大小?

    用什么方法可以快速使图片打印出来为A4纸大小?1、在手机电脑中无法找到需可打印的图片,点击右键该图片素材,在按钮的其他选项中选择中“打印后”操作按钮。2、在后弹的“可打印设置”新页面,将“印刷纸大小”去选择为“a4”。3、然后将新页面上方的

Copyright 2025 优质自媒体,让大家了解更多图文资讯!百度地图 360地图