热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

"C语言中的strcat函数混淆假设目标字符串足够大,可以保存源字符串及其自身的内容."

如何解决《"C语言中的strcat函数混淆假设目标字符串足够大,可以保存源字符串及其自身的内容."》经验,为你挑选了2个好方法。

所以我读到该strcat函数将被仔细使用,因为目标字符串应该足够大以容纳其自己和源字符串的内容.我写的以下程序也是如此:

#include 
#include 

int main(){
    char *src, *dest;
    printf("Enter Source String : ");
    fgets(src, 10, stdin);
    printf("Enter destination String : ");
    fgets(dest, 20, stdin);
    strcat(dest, src);
    printf("Concatenated string is %s", dest);
    return 0;
}

但对于我在这里写的那个不是这样的:

#include 
#include 

int main(){
    char src[11] = "Hello ABC";
    char dest[15] = "Hello DEFGIJK";
    strcat(dest, src);
    printf("concatenated string %s", dest);
    getchar();
    return 0;
}

该程序最终添加两者而不考虑目标字符串不够大.为什么会这样?



1> dbush..:

strcat函数无法确切知道目标缓冲区的长度,因此它假定传递给它的缓冲区足够大.如果不是,则通过写入缓冲区的末尾来调用未定义的行为.这就是第二段代码中发生的事情.

的代码的第一块也是无效的,因为这两个srcdest是未初始化的指针.当您将它们传递给fgets它时,它会读取它们包含的任何垃圾值,将其视为有效地址,然后尝试将值写入该无效地址.这也是未定义的行为.

使C快速的一个原因是它不会检查以确保您遵守规则.它只是告诉你规则,并假设你遵循它们,如果你没有坏事,可能会或可能不会发生.在你的特殊情况下,它似乎工作,但不能保证.

例如,当我运行你的第二段代码时,它似乎也有效.但如果我改成它:

#include 
#include 

int main(){
    char dest[15] = "Hello DEFGIJK";
    strcat(dest, "Hello ABC XXXXXXXXXX");
    printf("concatenated string %s", dest);
    return 0;
}

程序崩溃了.



2> Steve Summit..:

我认为你的困惑实际上并不是关于它的定义strcat.您真正的困惑是您认为C编译器会强制执行所有"规则".这个假设是非常错误的.

是的,第一个参数strcat必须是一个足以存储连接结果的内存指针.在您的两个程序中,都违反了该要求.你可能会从任何一个程序中缺少错误消息得到这样的印象:也许规则不是你想象的那样,strcat即使第一个参数不是指向足够内存的指针,它也会以某种方式调用.但不是,情况并非如此:strcat当内存不足时调用肯定是错误的.没有错误消息,或者一个或两个程序似乎"正常"的事实证明没有任何证据.

这是一个类比.(你小时候甚至可能有这种经历.)假设你的母亲告诉你不要跑到街对面,因为你可能会受到汽车的撞击.无论如何,假设你跑到街对面,不要被车撞到.你是否认为你母亲的建议不正确?这是一个有效的结论吗?

总而言之,您所阅读的内容是正确的:strcat必须谨慎使用.但是,让我们重申一下:打电话时一定要小心strcat.如果你不小心,各种各样的事情都可能出错,没有任何警告.事实上,许多风格指南建议不要使用任何功能strcat,因为如果你不小心,它们很容易被误用.(strcat只要你小心,这些功能可以完全安全地使用 - 当然并非所有程序员都非常小​​心.)


推荐阅读
  • C语言注释工具及快捷键,删除C语言注释工具的实现思路
    本文介绍了C语言中注释的两种方式以及注释的作用,提供了删除C语言注释的工具实现思路,并分享了C语言中注释的快捷键操作方法。 ... [详细]
  • 本文介绍了GTK+中的GObject对象系统,该系统是基于GLib和C语言完成的面向对象的框架,提供了灵活、可扩展且易于映射到其他语言的特性。其中最重要的是GType,它是GLib运行时类型认证和管理系统的基础,通过注册和管理基本数据类型、用户定义对象和界面类型来实现对象的继承。文章详细解释了GObject系统中对象的三个部分:唯一的ID标识、类结构和实例结构。 ... [详细]
  • Java String与StringBuffer的区别及其应用场景
    本文主要介绍了Java中String和StringBuffer的区别,String是不可变的,而StringBuffer是可变的。StringBuffer在进行字符串处理时不生成新的对象,内存使用上要优于String类。因此,在需要频繁对字符串进行修改的情况下,使用StringBuffer更加适合。同时,文章还介绍了String和StringBuffer的应用场景。 ... [详细]
  • Linux环境变量函数getenv、putenv、setenv和unsetenv详解
    本文详细解释了Linux中的环境变量函数getenv、putenv、setenv和unsetenv的用法和功能。通过使用这些函数,可以获取、设置和删除环境变量的值。同时给出了相应的函数原型、参数说明和返回值。通过示例代码演示了如何使用getenv函数获取环境变量的值,并打印出来。 ... [详细]
  • 本文介绍了南邮ctf-web的writeup,包括签到题和md5 collision。在CTF比赛和渗透测试中,可以通过查看源代码、代码注释、页面隐藏元素、超链接和HTTP响应头部来寻找flag或提示信息。利用PHP弱类型,可以发现md5('QNKCDZO')='0e830400451993494058024219903391'和md5('240610708')='0e462097431906509019562988736854'。 ... [详细]
  • OO第一单元自白:简单多项式导函数的设计与bug分析
    本文介绍了作者在学习OO的第一次作业中所遇到的问题及其解决方案。作者通过建立Multinomial和Monomial两个类来实现多项式和单项式,并通过append方法将单项式组合为多项式,并在此过程中合并同类项。作者还介绍了单项式和多项式的求导方法,并解释了如何利用正则表达式提取各个单项式并进行求导。同时,作者还对自己在输入合法性判断上的不足进行了bug分析,指出了自己在处理指数情况时出现的问题,并总结了被hack的原因。 ... [详细]
  • 本文介绍了在Windows系统上使用C语言命令行参数启动程序并传递参数的方法,包括接收参数程序的代码和bat文件的编写方法,同时给出了程序运行的结果。 ... [详细]
  • ejava,刘聪dejava
    本文目录一览:1、什么是Java?2、java ... [详细]
  • Java太阳系小游戏分析和源码详解
    本文介绍了一个基于Java的太阳系小游戏的分析和源码详解。通过对面向对象的知识的学习和实践,作者实现了太阳系各行星绕太阳转的效果。文章详细介绍了游戏的设计思路和源码结构,包括工具类、常量、图片加载、面板等。通过这个小游戏的制作,读者可以巩固和应用所学的知识,如类的继承、方法的重载与重写、多态和封装等。 ... [详细]
  • 本文介绍了基于c语言的mcs51单片机定时器计数器的应用教程,包括定时器的设置和计数方法,以及中断函数的使用。同时介绍了定时器应用的举例,包括定时器中断函数的编写和频率值的计算方法。主函数中设置了T0模式和T1计数的初值,并开启了T0和T1的中断,最后启动了CPU中断。 ... [详细]
  • 本文介绍了OC学习笔记中的@property和@synthesize,包括属性的定义和合成的使用方法。通过示例代码详细讲解了@property和@synthesize的作用和用法。 ... [详细]
  • c语言\n不换行,c语言printf不换行
    本文目录一览:1、C语言不换行输入2、c语言的 ... [详细]
  • JavaSE笔试题-接口、抽象类、多态等问题解答
    本文解答了JavaSE笔试题中关于接口、抽象类、多态等问题。包括Math类的取整数方法、接口是否可继承、抽象类是否可实现接口、抽象类是否可继承具体类、抽象类中是否可以有静态main方法等问题。同时介绍了面向对象的特征,以及Java中实现多态的机制。 ... [详细]
  • 全面介绍Windows内存管理机制及C++内存分配实例(四):内存映射文件
    本文旨在全面介绍Windows内存管理机制及C++内存分配实例中的内存映射文件。通过对内存映射文件的使用场合和与虚拟内存的区别进行解析,帮助读者更好地理解操作系统的内存管理机制。同时,本文还提供了相关章节的链接,方便读者深入学习Windows内存管理及C++内存分配实例的其他内容。 ... [详细]
  • 本文讲述了作者从最初对软件工程的选择迷茫到逐渐喜欢并坚持学习的经历。作者在大学期间通过学习专业课和参与项目开发,不断挑战自己并取得成就感。虽然曾考虑过转专业和复读,但最终决定坚持学习软件工程,并为自己的未来努力奋斗。作者还提到了大学生活与自己最初的预期不同,但对此并没有太多抱怨。 ... [详细]
author-avatar
mobiledu2502932307
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有