免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 3831 | 回复: 14
打印 上一主题 下一主题

[函数] sprintf困惑 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-10-23 14:07 |只看该作者 |倒序浏览
#include <cstdio>
#include <cstdlib>
#include <cstring>
using namespace std;

int main()
{
&nbsp;&nbsp;&nbsp;&nbsp;char s1[20]="319";
&nbsp;&nbsp;&nbsp;&nbsp;char s2[10];
&nbsp;&nbsp;&nbsp;&nbsp;memset(s2,0,sizeof(s2));
&nbsp;&nbsp;&nbsp;&nbsp;strcpy(s2,"1235");
&nbsp;&nbsp;&nbsp;&nbsp;sprintf(s1,"%s%s",s2,s1);
&nbsp;&nbsp;&nbsp;&nbsp;printf("%s\n",s1);
}

我本来想用这段代码实现字符串的拼接,吧s2加载到s1的前面,可为什么出来的结果却是12351235,如果要实现把s2加载到s1的后面却一切正常

论坛徽章:
0
2 [报告]
发表于 2008-10-23 14:22 |只看该作者
sprintf(s1,"%s%s",s2,s1);

第一步,已经把 s2 复制到 s1的地址了
第二步,再把 s1 接到 s1后面 ,这时s1已经是"1234"了

论坛徽章:
0
3 [报告]
发表于 2008-10-23 14:35 |只看该作者
原帖由 5毛党党员 于 2008-10-23 14:22 发表
sprintf(s1,"%s%s",s2,s1);

第一步,已经把 s2 复制到 s1的地址了
第二步,再把 s1 接到 s1后面 ,这时s1已经是"1234"了


C 标准中, 挡逗号操作符(,)出现在函数的参数列表中,则表达式的计算顺序跟实现有关。你的正好是从左至右进行计算,故得到12351235;如果换到别的机器上,实现是逗号操作符从有往左计算,则可以得到预期的结果。通常不要写和实现相关的代码。

论坛徽章:
36
IT运维版块每日发帖之星
日期:2016-04-10 06:20:00IT运维版块每日发帖之星
日期:2016-04-16 06:20:0015-16赛季CBA联赛之广东
日期:2016-04-16 19:59:32IT运维版块每日发帖之星
日期:2016-04-18 06:20:00IT运维版块每日发帖之星
日期:2016-04-19 06:20:00每日论坛发贴之星
日期:2016-04-19 06:20:00IT运维版块每日发帖之星
日期:2016-04-25 06:20:00IT运维版块每日发帖之星
日期:2016-05-06 06:20:00IT运维版块每日发帖之星
日期:2016-05-08 06:20:00IT运维版块每日发帖之星
日期:2016-05-13 06:20:00IT运维版块每日发帖之星
日期:2016-05-28 06:20:00每日论坛发贴之星
日期:2016-05-28 06:20:00
4 [报告]
发表于 2008-10-23 14:48 |只看该作者
1. 新声明一个字符串, strcat然后strcpy给s1
2. 将原先的s1中字符串保存在另外一个字符串里,然后实现copy

论坛徽章:
0
5 [报告]
发表于 2008-10-28 22:30 |只看该作者
哦,sprintf实际是上分两步走的,对吧

论坛徽章:
0
6 [报告]
发表于 2008-10-28 22:39 |只看该作者
哈,你忘了你用的是原始的愚蠢的C,你得从机器的角度想问题.

如果是OO的Java或者别的什么语言,你就可以用这样的思维.

论坛徽章:
0
7 [报告]
发表于 2008-10-28 22:39 |只看该作者
原帖由 cuteorange 于 2008-10-23 14:35 发表


C 标准中, 挡逗号操作符(,)出现在函数的参数列表中,则表达式的计算顺序跟实现有关。你的正好是从左至右进行计算,故得到12351235;如果换到别的机器上,实现是逗号操作符从有往左计算,则可以得到预期的结果 ...

给个掌声支持! 通常实现sprintf, 在c都是从左开始计算进行传参的, pasical其他的除外.

论坛徽章:
0
8 [报告]
发表于 2008-10-28 22:45 |只看该作者
原帖由 cuteorange 于 2008-10-23 14:35 发表


C 标准中, 挡逗号操作符(,)出现在函数的参数列表中,则表达式的计算顺序跟实现有关。你的正好是从左至右进行计算,故得到12351235;如果换到别的机器上,实现是逗号操作符从有往左计算,则可以得到预期的结果 ...


正解

论坛徽章:
1
双子座
日期:2015-01-04 14:25:06
9 [报告]
发表于 2008-10-29 08:48 |只看该作者
If copying takes place between objects that overlap as a result of a call to
       sprintf() or snprintf(), the results are undefined.

论坛徽章:
0
10 [报告]
发表于 2008-10-29 09:19 |只看该作者
一早就学到知识了
真好
谢谢大家
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP