首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >为什么当我们使用相同的源和目的地时,sprintf和snprintf的行为是不同的?

为什么当我们使用相同的源和目的地时,sprintf和snprintf的行为是不同的?
EN

Stack Overflow用户
提问于 2013-10-21 01:00:22
回答 3查看 4.8K关注 0票数 4

我有一个使用sprintf的简单代码

代码语言:javascript
运行
AI代码解释
复制
    #include <stdio.h>

    int main()
    {

            char str_src [1024]={"Hello"};
            sprintf(str_src,"%s%s",str_src,"hiiiiiiiiiii");
            printf("result = %s",str_src);  

    }

当我编译时,我得到了正确的结果:

结果= Hellohiiiiiiiiiii

但由于sprintf不安全,我决定将其改为snprintf。我以为这会很简单。我将sprintf改为snprintf,如下所示

代码语言:javascript
运行
AI代码解释
复制
snprintf(str_src,1024,"%s%s",str_src,"hiiiiiiiiiii");

现在,如果编译并运行代码,就会得到不同的结果。

结果= hiiiiiiiiiii

如果我使用str_src作为第四个参数(作为%s的值),我将面临这个问题。为什么snprintf的行为与sprintf不同?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-10-21 01:04:22

使用与目标和源相同的缓冲区是未定义的行为。

来自C11规范(7.21.6.6/2):

如果复制发生在重叠的对象之间,则行为是未定义的。

snprintf (7.21.6.5/2)也是如此,va_list变体也是如此。

不幸的是,这在运行代码中是很常见的,但是不能真正依靠它来工作。

票数 14
EN

Stack Overflow用户

发布于 2013-10-21 01:04:57

来自sprintf手册:

C99和POSIX1.2001指定,如果调用sprintf()、snprintf()、vsprintf()或vsnprintf()将导致重叠的对象之间进行复制(例如,如果目标字符串数组和提供的输入参数之一引用同一个缓冲区),则结果是未定义的。见注。

这个问题没有答案,因为您的代码有未定义的行为。

票数 5
EN

Stack Overflow用户

发布于 2013-10-21 01:05:02

不,在这两种情况下都会得到完全任意的结果,因为这是未定义的行为。其中一个恰好是你想要的。在不同的计算机上你可能得到不同的结果。不管它的价值是什么,它可能会格式化您的硬盘驱动器,但仍然是正确的行为。只是不要使用重叠的源和目标。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19490134

复制
相关文章
Simulator 和 Emulator 的相同和不同;
在看模拟器的时候,出现了关于Simulator和Emulator两种词汇;都可以翻译为模拟器;但在调研游戏模拟器的时候,多为Emulator; 两者词汇的含义和应用场景有什么异同呢?
西湖醋鱼
2021/02/23
2K0
不同层级的Android开发者的不同行为,我们该如何进阶和规划?
按我的理解,无论是Android开发者还是其他的开发者都可以分为四个层级,可依次对应普通、熟练、优秀、卓越这四个词。
Android技术干货分享
2019/03/27
1.5K0
不同层级的Android开发者的不同行为,我们该如何进阶和规划?
sprintf、strcpy和memcpy的区别
做某题用到了sprintf把一个字符数组(字符串)写到二维字符数组里,然后耗时挺长的,想了想strcpy好像也可以,事实证明strcpy效率果然更高,然后想了想觉得memcpy好像也可以。实践了一下的确可以,效率不用说也比sprintf高,毕竟memcpy是对内存操作。然后我就百度了一下它们的区别,做个总结(记笔记)。
饶文津
2020/06/02
1.7K0
源目的IP和端口都相同的连接出现的原因
线上遇到了一个比较特殊的连接,它的源目的IP和端口完全相同,复现的场景是:同一个机器上的两个模块A和B通信,A模块会向B模块的监听套接字发起连接请求,B模块重启的时候就很容易出现这样的问题。下图是在线
李海彬
2018/03/22
2.6K0
源目的IP和端口都相同的连接出现的原因
请说明Java的接口和C++的虚类的相同和不同处。
由于Java不支持多继承,而有可能某个类或对象要使用分别在几个类或对象里面的方法或属性,现有的单继承机制就不能满足要求。
剑走天涯
2019/09/02
8120
Spring 和 Mybatis 使用不同的数据源会怎样?
本篇文章要讨论的一个问题点, 给Spring和Mybatis设置不同的数据库数据源会怎样? 注意. 正常情况下一定要给Spring和Mybatis设置相同的数据库数据源. 案例代码位置 https:
书唐瑞
2022/06/02
5670
Spring 和 Mybatis 使用不同的数据源会怎样?
ssh和sftp为什么是同一端口_ssh和sftp使用不同的端口
SFTP(SSH File Transfer Protocol)即安全文件传送协议),是一数据流连接,提供文件访问、传输和管理功能的网络传输协议。其功能旨在允许客户端主机可以像访问本地存储一样通过网络访问服务器端文件。
全栈程序员站长
2022/10/05
3.9K0
npm install和cnpm install时的不同
npm 5版本,在延续npm 3扁平化依赖包安装方式的基础上,新增了一个package-lock.json文件。package-lock.json的主要作用就是锁定依赖项的安装目录和依赖包的版本信息。
kirin
2020/12/29
2.7K0
sprintf函数的使用
学C语言的同学对printf函数都不陌生。从世界上第一个程序(我认为的)"hello world”到你手里正写的某个程序,都少不了printf的影子。不过你也许不知道,printf还有一些兄弟——比如wprintf、sprintf等。
phith0n
2020/10/16
1.4K0
snprintf和strncpy对比
有关snprintf返回值更多信息,请参考:http://bbs.hadoopor.com/thread-1185-1-1.html
一见
2018/08/07
1.2K0
相同的时间,不同的人生
在规定的时间内,一个人目标的达成情况(创造的价值),我们称之为效率。如此可见效率与时间是密切相关的,提高效率首先要做的就是提高我们的时间利用率。
keinYe
2020/05/25
1.2K0
sprintf_s的使用
syntax int sprint_s( char *buffer, size_t sizeOfBuffer, const char *format ) /* header:stdio.h */ Parameters buffer Storage location for output sizeOfBuffer Maximum number of character to store. format Format-control string Return Value The num
青木
2018/05/28
3.4K0
python引入相同和不同(模块)文件夹下py文件的类
从SyncMysqlMongo中引入MongoDBUtil.py和MySQLUtil.py中的两个类(这里的类名和文件名一致)
静谧星空TEL
2022/01/05
8.1K0
python引入相同和不同(模块)文件夹下py文件的类
2020-10-22:谈谈java中的LongAdder和LongAccumulator的相同点和不同点。
LongAddr与LongAccumulator类都是使用非阻塞算法CAS实现的,这相比于使用锁实现原子性操作在性能上有很大的提高。
福大大架构师每日一题
2020/10/22
8190
论文解释:Vision Transformers和CNN看到的特征是相同的吗?
点击上方“Deephub Imba”,关注公众号,好文章不错过 ! 近年来,Vision Transformer (ViT) 势头强劲。本文将解释论文《Do Vision Transformers S
deephub
2021/10/20
2.2K0
论文解释:Vision Transformers和CNN看到的特征是相同的吗?
php 比较获取两个数组相同和不同元素的例子(交集和差集)
array_intersect()该函数比较两个(或更多个)数组的键值,并返回交集数组,该数组包括了所有在被比较的数组(array1)中,
用户8824291
2021/07/13
3.3K0
in 和 exists 的不同
in 是把外表和内表做 hash 连接,而 exists 是对外表作 loop 循环,每次 loop 循环再对内表进行查询,一直以来认为 exists 比 in 的效率高的说法是不准确的。如果两个表大小相当,则 in 和 exists 的效率是差不多的,如果两个表的一大一小,则子查询表大的用 exists,子查询表小的用 in。
zucchiniy
2019/10/30
8190
光纤与铜缆的插入损耗相同和不同点分析
对于网络电缆,正确的方法是使用术语“插入损耗”,指链路远端的信号强度损耗,包括电缆和通路上所有连接点(例如连接器和接头)引起的衰减,以及信号反射造成的信号损耗。除了术语修正之外,限值、测试方法和要求没有变化。
朗坤君
2021/06/07
1.2K0
我们平时是怎么写html和css的?
文章的起因,我只是为了回复一个帖子,http://bbs.csdn.net/topics/390908928?page=1 结果,一扯就根本停不下来。索性,一捅为快,反正是周末。 拿到效果图时,
bear_fish
2018/09/19
1.5K0
我们平时是怎么写html和css的?
点击加载更多

相似问题

snprintf和sprintf解释

50

sprintf和snprintf无法封装双重

312

PCAP目的地和源相同

14

对于单一的源和目的地,我们能有不同的距离吗?

211

与sprintf重叠的内存(Snprintf)

30
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
社区富文本编辑器全新改版!诚邀体验~
全新交互,全新视觉,新增快捷键、悬浮工具栏、高亮块等功能并同时优化现有功能,全面提升创作效率和体验
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文