读书人

关于sprintf的%d有关问题

发布时间: 2012-04-20 15:27:03 作者: rapoo

关于sprintf的%d问题
有段代码如下
long i = 99999;
char* s;
s = (char *)malloc(10);
sprintf(s,"%05d",i);
....

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

是否我理解错误?请高手指点一下呢。

[解决办法]
32位系统中int和long是一样的,所以没问题
而且就算不一样,隐形的把long转换int也没什么问题
[解决办法]

C/C++ code
sprintf(s,"%05d",i);//这样不会报错,强转了一下而已。。。但是原则上是有问题的
[解决办法]
强制类型转换

sprintf(s, "%05d", (int)i);
[解决办法]
按道理来说,应该是有问题的。
这里没错,是一个巧合的问题。
1、恰好int和long的结构一样。
2.恰好在32位及其上int和long都是4个字节.
于是,在这里使用%d和%ld都一样了。

[解决办法]
个人觉得没有强转,仅仅是按照所给的格式%d去读取i而已
能正常读出就读出,不能正常读出就出错
就比如此处换成"%f",就会出错(我的机子(32bit)上)
这就是因为这两类型内存里的布局相差太大按"%f"的方式读不了
嗯就是这样
[解决办法]
其实你这段代码的主要问题并不是这里,你动态的分配了十个字节的空间,然后用指向字符的指针指向这块区域,然后你用sprintf将格式话的数据写到了字符指针指向的空间,如果你想用该指针访问改数据的话,得到的可能并不是你想要的。
建议你 long *l = (long *)malloc(sizeof(long) * 10);
这样可能会好点
[解决办法]
六十四位就死了!
大端机还会更惨!
[解决办法]
探讨

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

[解决办法]
在绝大部分32位以上的平台上long和int是一模一样的
[解决办法]
探讨

应该是自动有低层向高层转换了!int 提升到了long!有编译器做这个工作了

读书人网 >C语言

热点推荐