游戏开发论坛

 找回密码
 立即注册
搜索
查看: 7365|回复: 10

请教:float不是占4字节吗?怎么sprintf(..."%f"

[复制链接]

16

主题

43

帖子

43

积分

注册会员

Rank: 2

积分
43
发表于 2010-2-13 22:14:00 | 显示全部楼层 |阅读模式
是这样的,我用sprintf(buf,"%f%c",3.14,0)把数值装入一个char型数组里,结尾为0,然后用strlen(buf)时发现结果是8,这不对呀!我必须大量通过网络传输浮点型数,本来要传输4字节,这等于传输8字节,翻了一倍。大侠们,救命要紧!

30

主题

422

帖子

433

积分

中级会员

Rank: 3Rank: 3

积分
433
发表于 2010-2-14 00:51:00 | 显示全部楼层

Re:请教:float不是占4字节吗?怎么sprintf(..."%f"...)

strlen(buf)得到的8不是float的长度,而是3.14转为字符串的长度。
直接传float为啥要转字符串再传?

16

主题

43

帖子

43

积分

注册会员

Rank: 2

积分
43
 楼主| 发表于 2010-2-14 02:26:00 | 显示全部楼层

Re:请教:float不是占4字节吗?怎么sprintf(..."%f"...)

那你用CSocket类传输浮点数怎么传?我是把浮点数存入字符数组再传

54

主题

2918

帖子

3765

积分

论坛元老

Rank: 8Rank: 8

积分
3765
QQ
发表于 2010-2-14 11:31:00 | 显示全部楼层

Re:请教:float不是占4字节吗?怎么sprintf(..."%f"...)

你可以试着这么些: sprintf(buf,"%1.2f %c",3.14,0)

30

主题

422

帖子

433

积分

中级会员

Rank: 3Rank: 3

积分
433
发表于 2010-2-15 13:49:00 | 显示全部楼层

Re:请教:float不是占4字节吗?怎么sprintf(..."%f"...)

假设有如下定义:
float a = 3.14;
char buf[sizeof(float)];

memcpy(buf, &a, sizeof(buf)); // 如此存入数组即可,不必转换为字符串
读取时也是一样
memcpy(&a, buf, sizeof(a));

16

主题

43

帖子

43

积分

注册会员

Rank: 2

积分
43
 楼主| 发表于 2010-2-15 17:22:00 | 显示全部楼层

Re: Re:请教:float不是占4字节吗?怎么sprintf(..."%f".

kaikai: Re:请教:float不是占4字节吗?怎么sprintf(..."%f"...)中的%f占8字节呀?

假设有如下定义:
float a = 3.14;
char buf[sizeof(float)];

memcpy(buf, &a, sizeof(buf)); // ...

谢谢!是正解!

1

主题

11

帖子

11

积分

新手上路

Rank: 1

积分
11
发表于 2010-2-15 22:32:00 | 显示全部楼层

Re:请教:float不是占4字节吗?怎么sprintf(..."%f"...)

在printf、scanf这些函数中%f是按double读入的。。如果参数表中是非double型的字面值常量,会读出不可思议的数据。。话说不久前某次面试刚考过此题。。恶心了一阵子。。

1

主题

88

帖子

93

积分

注册会员

Rank: 2

积分
93
QQ
发表于 2010-3-15 13:18:00 | 显示全部楼层

Re: Re:请教:float不是占4字节吗?怎么sprintf(..."%f".

guanxiku: Re:请教:float不是占4字节吗?怎么sprintf(..."%f"...)中的%f占8字节呀?

在printf、scanf这些函数中%f是按double读入的。。如果参数表中是非double型的字面值常量,会读出不可思议的数据。。话说不久前某次面试刚考过此题。。恶心了一阵子。。


的确是这样,很恶心 就比如printf("%d",10/3);这个就很恶心~

1

主题

88

帖子

93

积分

注册会员

Rank: 2

积分
93
QQ
发表于 2010-3-15 13:39:00 | 显示全部楼层

Re:请教:float不是占4字节吗?怎么sprintf(..."%f"...)

错了~是printf("%f",10/3);

32

主题

1583

帖子

1589

积分

金牌会员

Rank: 6Rank: 6

积分
1589
发表于 2010-3-15 16:58:00 | 显示全部楼层

Re:请教:float不是占4字节吗?怎么sprintf(..."%f"...)

这帖子貌似把n多不同的问题揉杂在一起了。

首先LZ貌似把float占用的空间和float转换为字符串占用的空间这俩概念没搞清楚。
网络传输,要看你怎么传输,如果仅仅是套接字传送二进制数据,你直接按字节发送不就完了,有必要封成字符串么?如果是要考虑在以文本为基础的协议上面传输的话,比较好的方式是Base64编码。

最后,关于printf和scanf的参数,请参考C里面的va_arg相关的章节,它做成那样的设定是有原因的,尽管C++之后有了类型安全的IO之后不推荐使用了。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2025-6-12 18:39

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表