社区
C语言
帖子详情
关于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
打赏
收藏
关于sprintf的%d问题
有段代码如下 long i = 99999; char* s; s = (char *)malloc(10); sprintf(s,"%05d",i); .... 这段代码是否有问题? 感觉上认为%d是对整形进行10进制format的,觉得应该是 sprintf(s,"%05ld",i); 才对。 但是执行起来又没问题。 是否我理解错误?请高手指点一下呢。
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用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也没什么问题
关于
sprin
tf
整合%d出错的
问题
有些编译器用到
sprin
tf
函数整合%d类型的数据时候可能会出错例如 错误的示例 char *p[80]=0; memset(p,0,sizeof(p));
sprin
tf
((char *)p,"AT+CIPSTART=\"TCP\",\"%d.%d.%d.%d\",%d\r\n",210,209,82,119,8080); PrintString1(p); 输出的值为 : AT+CIPS...
C语言
sprin
tf
函数%d%t%n
描述 C语言字符串各常见类型变量,使用prin
tf
替换体%写法 写法 int:%d string:%s float:%f 空格:%t 换行:%n 特殊 双引号 字符串中怎么出现双引号 // my name is "Mac" string = "my name is \"Mac\"" tab和字符串换行 如何在字符串中体现tab,并且在字符串过长时还能进行换行编写呢 在一行字符串后面加上 \ 使...
sprin
tf
%02x
#include #include #define lo(f) ((f)&0xff) #define hi(f) (lo(f>>8)) int main(void) { int key; do { key=bioskey(0); prin
tf
("0x%02x 0x%02x %c\n",hi(key),lo(key),lo(key));//这条语句中0x%02x是什么意思??
sprin
tf
%m.ns %m.nf
自己控制打印的宽度和小数位数,这时就应该使用:“%m.nf”格式,其中m表示打印的宽度,n表示小数点后的位数。比如: 1 2 3
sprin
tf
(s, "%10.3f", 3.1415626); // 产生:" 3.142″
sprin
tf
(s, "%-10.3f", 3.1415626); // 产生:"3.142 ...
Matlab:
sprin
tf
格式化输出 数值%d
sprin
tf
函数原型: str =
sprin
tf
(formatSpec,A1,...,An) % formats the data in arrays A1,...,An according to formatSpec in column order, and returns the results to str. % 返回值str是格式化后的字符串形式,formatSpec是form...
C语言
69,368
社区成员
243,081
社区内容
发帖
与我相关
我的任务
C语言
C语言相关问题讨论
复制链接
扫一扫
分享
社区描述
C语言相关问题讨论
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章