找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3250|回复: 9
打印 上一主题 下一主题
收起左侧

C语言sprintf函数问题

[复制链接]
跳转到指定楼层
楼主
50黑币


如图  第一个可以正常运行

第二个  浮点型程序卡这不运行了

求大神指点

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:306945 发表于 2019-2-22 17:49 | 只看该作者
可能是浮点数类型转换成整形时,缺少小数部分

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

板凳
ID:105804 发表于 2019-2-22 20:05 | 只看该作者
我印象中好像不能这样写的,sprintf(str,"%d",sw);这里的str代表的是str[80]的首地址,两个不同数据类型的数据数组str的首地址开始存储,这样写好像会引起段错误的,最好另外定义多一个数组;还有就是你第一个最好强制类型转换一下,

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

地板
ID:477932 发表于 2019-2-22 22:07 | 只看该作者
C语言很基础的知识

评分

参与人数 1黑币 +10 收起 理由
嘉立创AAA + 10

查看全部评分

回复

使用道具 举报

5#
ID:461179 发表于 2019-2-23 15:09 | 只看该作者
要么在第一个sprintf之后清空str里的内容,要么就再定义一个字符串来存储。不然第一个都没有意义。
还有,什么叫程序卡在这了。。。。

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

6#
ID:94031 发表于 2019-2-23 15:17 | 只看该作者
要用 (float) 强制转换一下。

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

7#
ID:479827 发表于 2019-2-23 23:17 | 只看该作者
sprintf的作用是将一个格式化的字符串输出到一个目的字符串中,sprintf的第一个参数应该是目的字符串,如果不指定这个参数,执行过程中出现     "该程序产生非法操作,即将被关闭...."的提示。 因为C语言在进行字符串操作时不检查字符串的空间是否够大,所以可能会出现数组越界而导致程序崩溃的问题。即使碰巧,程序没有出错,也不要这么用,因为早晚会出错。所以一定要在调用sprintf之前分配足够大的空间给buf。int i = 100; sprintf(s, "%.2f", i); 会打出什么东东来?“100.00”?对吗?自己试试就知道了,第一个打出来的肯定不是正确结果,原因跟前面提到的一样,参数压栈时调用者并不知道跟i 相对应的格式控制符是个”%f”。而函数执行时函数本身则并不知道当年被压入栈里的是个整数, 于是可怜的保存整数i 的那4 个字节就被不由分说地强行作为浮点数格式来解释了,整个乱套了。试试 sprintf(s, "%.2f", (double)i);
回复

使用道具 举报

8#
ID:479827 发表于 2019-2-23 23:19 | 只看该作者
sprintf的作用是将一个格式化的字符串输出到一个目的字符串中,而printf是将一个格式化的字符串输出到屏幕。sprintf的第一个参数应该是目的字符串,如果不指定这个参数,执行过程中出现     "该程序产生非法操作,即将被关闭...."的提示。
因为C语言在进行字符串操作时不检查字符串的空间是否够大,所以可能会出现数组越界而导致程序崩溃的问题。即使碰巧,程序没有出错,也不要这么用,因为早晚会出错。所以一定要在调用sprintf之前分配足够大的空间给buf。
int i = 100;
sprintf(s, "%.2f", i);
会打出什么东东来?“100.00”?对吗?自己试试就知道了
第一个打出来的肯定不是正确结果,原因跟前面提到的一样,参数压栈时调用者并不知道跟i
相对应的格式控制符是个”%f”。而函数执行时函数本身则并不知道当年被压入栈里的是个整数,
于是可怜的保存整数i 的那4 个字节就被不由分说地强行作为浮点数格式来解释了,整个乱套了。
试试下面这个:
sprintf(s, "%.2f", (double)i);

评分

参与人数 1黑币 +100 收起 理由
admin + 100 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

9#
ID:479009 发表于 2019-2-24 01:24 | 只看该作者
就是压栈位数的问题,默认当int两个字节,float是4个字节的。
默认位数跟编译器关系很大,c51,gcc,vc都不一样。
C51的double和float都是4字节的,别的地方可不一样,要小心。
感觉换成sprintf(s, "%.2f", (float)i);在更多的平台上通用
回复

使用道具 举报

10#
ID:480566 发表于 2019-2-25 19:29 | 只看该作者
应该强制转换一下类型,自动补齐小数点后面的。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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