C语言printf打印函数名函数打印问题

专注于嵌入式linux内核、驱动和应用的开发,请同时关注个人博客网站:http://velep.com/—reille博客...
printf()函数关于不能打印字符的问题
作者:reille
本博客网址:,转载本博客原创文章请注明出处。
本文内容概要:说明printf()函数关于不能打印字符的问题
———————————————————————————————————————————————————————————————————
今天想使用printf()函数在串口上每秒输出一个‘C’字符,实现在串口上如CCCCCC的显示,但直接使用printf("C");语句时,要么不输出,要么一下子输出很多CCCCC。
而使用printf("C\n");语句时则可正常输出显示,但这不是我要的输出格式。
事实上这个问题涉及到printf()输出缓冲的问题。
对于标准输出设备stdout,输出一般都有缓冲,当遇到刷新标志或缓冲满时才把缓冲的数据输出到标准输出设备中。
对于printf()函数,其使用的输出设备就是标准输出设备stdout,且采用行缓冲式的输出,当printf()遇到\n时,或者缓冲区满时,才会将缓冲区里的内容刷新到标准输出(stdout).
因此, printf("C"); 等语句的显示不能立刻显示在串口上,而printf("C\n");则可以立刻输出到串口中。
为了解决这个问题,可以通过:fflush(stdout);解决,即:
printf("C");
fflush(stdout);
从而实现要求的CCCCCCCC输出格式。注:在C语言库函数中,是有fflush()这个库函数的。
没有更多推荐了,
加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!在 SegmentFault,学习技能、解决问题
每个月,我们帮助 1000 万的开发者解决各种各样的技术问题。并助力他们在技术能力、职业生涯、影响力上获得提升。
问题对人有帮助,内容完整,我也想知道答案
问题没有实际价值,缺少关键内容,没有改进余地
int main(int argc, const char * argv[]) {
printf("%g\n", (double)15/10 );//1.5
printf("%g\n", 25/(double)10 );//2.5
printf("%g\n", 35/10 );//2.5
printf("%g\n", (double)(45/10) );//4
return EXIT_SUCCESS;
int main(int argc, const char * argv[]) {
printf("%g\n", 35/10 );//0
return EXIT_SUCCESS;
请帮忙解释一下 35/10 的输出?
printf("%g\n", 3 );//0
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
If a conversion specification is invalid, the behavior is undefined.If any argument is not the correct type for the correspondingconversion specification, the behavior is undefined.
g代表浮点,但是传入的是int型,printf的行为是不可控的。
有意思的实验
printf("%d, %f, %d, %f\n", 666.0, 555, 444, 333.0);
555, 666.4, 333.000000
似乎int和float被放入两个不同的stack,根据实际类型来消费stack里的数据 (大误,瞎猜 ^ ^)
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
很高兴看到这样的问题,因为这涉及到现在的人们已经普遍不怎么关心的底层操作。在人们看来,浮点数和整数就差了一个小数点,但在计算机看来,这里面差别缺非常之大。这是因为他们的解析方式不同。
int main(int argc, const char * argv[]) {
float i = 3;
printf("%08x\n", *(unsigned int*)&i);
unsigned int j = 3;
printf("%08x\n", *(unsigned int*)&j);
getchar();
return EXIT_SUCCESS;
这段代码用来输出内存中他们真正的值(十六进制)。 这两句的代码唯一的区别在于他们的类型不同,第一个为float,第二个为unsigned int。在人类看来,他们几乎是一样的,但在内存中,他们完全不可混为一谈。上面的输出结果为
即,浮点型的3在内存中为,整数型的在内存中为3。怎么样,他们的是不是不一样的?
int main(int argc, const char * argv[]) {
float i = 3;
printf("%g\n", i);
int j = 3;
printf("%g\n", j);
getchar();
return EXIT_SUCCESS;
那么你认为他们的结果会一致吗?当然不会。它的结果为:
2.5 //溢出,可能不一致
在c语言中/运算符不会改变结果类型,也就是说,两个整数型相除的结果也是个整数型。
int main(int argc, const char * argv[]) {
printf("%g\n", 35 / 10);//0
getchar();
return EXIT_SUCCESS;
你的代码中就相当于
int main(int argc, const char * argv[]) {
printf("%g\n", 3);
getchar();
return EXIT_SUCCESS;
这当然不会是你期望的。
要怎么证明呢?很简单,我们看下反汇编的代码就知道了
edi,[ebp-0C0h]
eax,0CCCCCCCCh
dword ptr es:[edi]
//此处传入的本来就是个常量 3
offset string "%g\n" (0D23D20h)
_printf (0D01F91h)
dword ptr [__imp__getchar (0D2A3A0h)]
__RTC_CheckEsp (0D0161Dh)
__RTC_CheckEsp (0D0161Dh)
我们将上面的代码稍微改一下,只要让编译器认为我们输入的是个小数型就可以了。方法有很多种。
printf("%g\n", (double)15/10 );//1.5
printf("%g\n", 25/(double)10 );//2.5
printf("%g\n", 35/10+0.0 );//2.5
printf("%g\n", (double)(45/10) );//4
分享到微博?
关闭理由:
删除理由:
忽略理由:
推广(招聘、广告、SEO 等)方面的内容
与已有问题重复(请编辑该提问指向已有相同问题)
答非所问,不符合答题要求
宜作评论而非答案
带有人身攻击、辱骂、仇恨等违反条款的内容
无法获得确切结果的问题
非开发直接相关的问题
非技术提问的讨论型问题
其他原因(请补充说明)
我要该,理由是:
在 SegmentFault,学习技能、解决问题
每个月,我们帮助 1000 万的开发者解决各种各样的技术问题。并助力他们在技术能力、职业生涯、影响力上获得提升。欢迎加入我们,一同切磋技术 &
用户名: &&&
密 码: &
共有 4407 人关注过本帖
标题:printf函数%d只能输出int类的整数值吗?
等 级:侠之大者
帖 子:2168
专家分:425
结帖率:79.83%
&&已结贴√
&&问题点数:1&&回复次数:5&&&
printf函数%d只能输出int类的整数值吗?
unsigned int ui = 0
printf(&%d&,ui);得到的饿是一个负数呢?
搜索更多相关主题的帖子:
等 级:论坛游民
帖 子:49
专家分:75
恩 你的猜想正确......
即使要输出的变量不是整数,它也先换成整数在输出......
得出负数,因为unsigned int 是有数值限制的。0到 62353
而且你赋值长了0xffffffff&&=&&
只能到得62353,而用%d显示,只能显示-3
不管多大 都只在那范围徘徊 比如显示:32768 = -32768 ,32769 = -32767
等 级:论坛游侠
帖 子:92
专家分:141
来 自:CC
等 级:贵宾
威 望:16
帖 子:1137
专家分:1696
正确说法是printf函数不管你的变量类型,只管按照格式符的含义来解释数据
printf(&%u\n&,i);
32位平台会输出
16位的输出65535
[ 本帖最后由 forever74 于
20:16 编辑 ]
别人能不等于你能,别人不能不等于你不能
不要问别人能不能,要说:我能
等 级:侠之大者
帖 子:2168
专家分:425
回复 4楼 forever74
这么说 %d&&是表示现实有符号的整数,而%u才显示无符号整数
~~~~~~~~~~~~~~~好好学习~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
等 级:侠之大者
帖 子:2168
专家分:425
果然如四楼说的
u 才是无符号显示 ,而与数据类型本身无关!
附件: 您没有浏览附件的权限,请
~~~~~~~~~~~~~~~好好学习~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
版权所有,并保留所有权利。
Powered by , Processed in 0.034349 second(s), 7 queries.
Copyright&, BCCN.NET, All Rights Reservedc语言 不用printf函数 打印字符串输出
按时间排序
一、如果是PC机,那就循环调用putchar,写自己的打印函数。二、如果是嵌入式,完全可以自己写全部代码。
你看看printf的原函数,没准儿就来了灵感呢
在MATLAB中,可以使用sprintf来格式化输出变量。MATLAB的sprintf用法几乎和C中的printf一样,参数都是printf(FORMAT,A,...)MATLAB的sprintf会返回一个字符串,当不使用分号;时,可以直接在屏幕输出。MATLAB的sprintf语法为[s, errmsg] = sprintf(format, A, ...)可以把矩阵A做数据格式的转换,格式就是format参数。例子:Str = [65 66 67 pi];
sprintf('%s %f', Str)可得:
ABC 3.141593
fprintf(格式控制,变量)
感谢您为社区的和谐贡献力量请选择举报类型
经过核实后将会做出处理感谢您为社区和谐做出贡献
确定要取消此次报名,退出该活动?
请输入私信内容:}

我要回帖

更多关于 printf函数实现 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信