关于sprintf的%d问题

ccccffff 2012-04-13 02:55:04
有段代码如下
long i = 99999;
char* s;
s = (char *)malloc(10);
sprintf(s,"%05d",i);
....

这段代码是否有问题?
感觉上认为%d是对整形进行10进制format的,觉得应该是
sprintf(s,"%05ld",i); 才对。
但是执行起来又没问题。

是否我理解错误?请高手指点一下呢。
...全文
1305 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
自由建客 2012-04-13
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 的回复:]

应该是自动有低层向高层转换了!int 提升到了long!有编译器做这个工作了
[/Quote]
变参入栈好像是按 long 进的,此时若 i 是 int 还真会被提升为 long。
但 %d 只会取 int 的那么多字节,不会多取。入栈时没错,打印时也会错误。
自由建客 2012-04-13
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 的回复:]

引用 8 楼 的回复:

六十四位就死了!
大端机还会更惨!

不管大端小端,printf出来的都是一样的东西,即“99999”
[/Quote]
99999 太小,超过 2G 就可看到区别了!
大端机打印出来的将是 i 的高位的四个字节,若 i 不足 4G,看到的将是 0。
一根烂笔头 2012-04-13
  • 打赏
  • 举报
回复
应该是自动有低层向高层转换了!int 提升到了long!有编译器做这个工作了
小默 2012-04-13
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 的回复:]

六十四位就死了!
大端机还会更惨!
[/Quote]
不管大端小端,printf出来的都是一样的东西,即“99999”
ohayou 2012-04-13
  • 打赏
  • 举报
回复
在绝大部分32位以上的平台上long和int是一模一样的
nice_cxf 2012-04-13
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 的回复:]

六十四位就死了!
大端机还会更惨!
[/Quote]
多少位都没关系没记错的化long>=int至于大小端,还没听说过在同一台机器上,long和int的大小端不同
ccccffff 2012-04-13
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 的回复:]

六十四位就死了!
大端机还会更惨!
[/Quote]
我现在就是在64位上测试的,没死啊
自由建客 2012-04-13
  • 打赏
  • 举报
回复
六十四位就死了!
大端机还会更惨!
惬意 2012-04-13
  • 打赏
  • 举报
回复
不好意思,上面我的回答有问题,没有仔细思考
惬意 2012-04-13
  • 打赏
  • 举报
回复
其实你这段代码的主要问题并不是这里,你动态的分配了十个字节的空间,然后用指向字符的指针指向这块区域,然后你用sprintf将格式话的数据写到了字符指针指向的空间,如果你想用该指针访问改数据的话,得到的可能并不是你想要的。
建议你 long *l = (long *)malloc(sizeof(long) * 10);
这样可能会好点
useroflj 2012-04-13
  • 打赏
  • 举报
回复
个人觉得没有强转,仅仅是按照所给的格式%d去读取i而已
能正常读出就读出,不能正常读出就出错
就比如此处换成"%f",就会出错(我的机子(32bit)上)
这就是因为这两类型内存里的布局相差太大按"%f"的方式读不了
嗯就是这样
evencoming 2012-04-13
  • 打赏
  • 举报
回复
按道理来说,应该是有问题的。
这里没错,是一个巧合的问题。
1、恰好int和long的结构一样。
2.恰好在32位及其上int和long都是4个字节.
于是,在这里使用%d和%ld都一样了。
northcan 2012-04-13
  • 打赏
  • 举报
回复
强制类型转换

sprintf(s, "%05d", (int)i);
面包大师 2012-04-13
  • 打赏
  • 举报
回复
sprintf(s,"%05d",i);//这样不会报错,强转了一下而已。。。但是原则上是有问题的
nice_cxf 2012-04-13
  • 打赏
  • 举报
回复
32位系统中int和long是一样的,所以没问题
而且就算不一样,隐形的把long转换int也没什么问题

69,368

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧