为什么有时候printf无法显示输出?

如题所述

调试一些短小的程序的时候,一般会用printf等输出一些有用信息,以粗略的定位Bug的位置!作为学习C语言甚至刚接触计算机开始,就认识的printf函数,可能我们已经非常的熟悉其使用了,虽然对其底层格式化输出的原理知之甚少,对整个执行流程似懂非懂。

不知道你是否曾经遇到过printf失灵的情况,即本应该打印数据,却没有任何输出信息?这个时候你可能首先怀疑,printf之前的程序除了问题,可能出现了死锁,或者死循环等:

但是如果我们把这个程序,稍加修改呢?

你会发现,依然没有任何输出!

(必须是Linux 环境,win中是有输出的,两者的实现不同,我们主要考虑Linux环境)

你可能从来没听过,printf输出,居然还有条件,这是在《C prime Plus 第五版》中学习到的,当时的我也同样惊讶。直到前不久,同窗的学妹同样表示了惊讶,所以我决定分享这个小知识,printf在满足以下三个条件之一时,会将缓冲区中的数据输出:





其中1、3情况,是我们在绝大多数时候会使用的,因此在绝大部分情况下,你都不会察觉到printf的“异常”。

1KB,可以自己写程序验证

虽然是很简单的小知识,但是有时候真的非常有用,比如在调试linux内核时,使用的printk同样遵循了这个规则,在内核中程序是不会终止的,这个时候就必须要加上换行符,否则就会看不到输出,哈哈,如果忘了加,可能就需要重新编译内核!
温馨提示:内容为网友见解,仅供参考
无其他回答

printf不能输出什么原因?
如果在使用 printf 函数时,遇到了%f格式控制符不能输出的问题,可能有以下几种原因:变量类型不匹配:在使用%f格式控制符时,需要保证输入的变量类型与格式控制符%f匹配。如果输入的变量不是浮点数类型,那么%f格式控制符将无法输出正确的结果。解决方法是检查输入的变量类型是否正确,如果需要,可以为变量强...

为什么有时候printf无法显示输出?
或 或 其中1、3情况,是我们在绝大多数时候会使用的,因此在绝大部分情况下,你都不会察觉到printf的“异常”。1KB,可以自己写程序验证 虽然是很简单的小知识,但是有时候真的非常有用,比如在调试linux内核时,使用的printk同样遵循了这个规则,在内核中程序是不会终止的,这个时候就必须要加上换行...

C语言中printf()中的内容为什么不会全部输出到控制台上?
这通常是由于控制台窗口的默认大小或输出缓冲区的大小限制所致。控制台窗口有一个默认大小,它指定了控制台窗口显示多少行文本和多少列字符。如果你的输出格式化字符串过长,可能会超过控制台窗口的列宽度,从而导致部分内容无法显示,而被截断了。另外,C语言标准库在输出时也会使用缓冲区,如果输出过于频繁...

C语言printf输出时,为什么当我把 格式串中的 \\n 去掉之后无法输出了呢...
printf并不会直接输出到屏幕,而是输出到缓冲区。只有当有刷新缓冲区的时候才会输出到屏幕。导致缓冲区刷新到情况有这些:1 强制刷新 fflush;2,放到缓冲区到内容中包含\\n \\r ;3,缓冲区已满;4,需要从缓冲区拿东西到时候,如执行scanf。去掉那个\\n之后缓冲区一直得不到刷新,会一直等到缓冲区满的...

调用C库的printf函数为什么不能输出
但作为一个特例,不要求在使用 printf 函数之前必须包含stdio.h文件。printf函数调用的一般形式为: printf(“格式控制字符串”, 输出表列)其中格式控制字符串用于指定输出格式。格式控制串可由格式字符串和非格式字符串两种组成。格式字符串是以%开头的字符串,在%后面跟有各种格式字符,以说明输出数据...

请问我的C语言中printf为什么没有输出?
scanf里面不要加\\n 不然会无法得到正确结果 你这个就是卡在scanf里面了

调用C库的printf函数为什么不能输出
这个是因为楼主没有指定程序入口点所致在LINK时加上参数 \/entry:start 即可 或者在你的代码中写成如下格式亦可:...codestart: ... ...end start \/\/ 关键这里就是指示你的程序入口点 没有这个而且也没有在LINK时用\/entry:xxxx指出入口点的话 LINK默认是要找C runtime的_mainCRTStartup(控制台...

菜鸟提问。为什么printf输出的会是空白
scanf("%s",a); for(int i=0;i<strlen(a);i++) \/\/不能把a的所有元素都倒置,因为a的后面几个元素可能都还是'\\0'字符,倒置以后,'\\0'字符就变成b的前面几个元素了,printf打印b就没有输出了。 { b[i]=a[7-i]; } printf("%s",b); printf("\\n"); return 0;} ...

scanf输入后printf为什么无法输出?
scanf中的格式字符串写错了,你写的那两个根本不是scanf的格式字符串,格式字符串告诉程序输入的内容,如果不写格式字符串,程序就无法从键盘得到值,有如下几种:d:有符号十进制整型:如 int ,short;c: 单个字符:如char ld:有符号十进制长整型,如long f:十进制浮点型,如float,double s:字符...

vs2013printf没有输出
printf的内容放在缓冲区里面还没有刷出来。原则上是缓冲区满了以后才输出,成为标准输出流,不过你可以在printf后面加一个fflush(stdout)。这样就能立即输出来了。

相似回答
大家正在搜