Win10+VC2019控制台程序 printf死锁问题
我遇到的问题:
环境:VC2019 控制台程序+ window10
操作:
调试控制台时用到,printf()输出显示。
printf("输入一个字符,开始下一个测试.\n"); // 注意:问题在.\n 这里
测试时发现,控制台偶尔会莫名的卡死,没有任何显示。
逐行查找后发现,程序运行到printf()就在也没有了动静。
由此证明printf()造成了程序死锁。
先查阅网友的经验:
摘录:
C++ printf 、cout 无法输出到控制台问题
再编写程序的过程中,使用printf 输出变量值没用,然后用cout进行替换也是没用
#include <stdio.h>
#include <stdlib.h>
#include <iostrea>
#include <string.h>
using namespace std;
int main (int args,char *argv[])
{
if (args !=2) printf("please set prot , such as you can set 8000" ); // 注意:这里没有 /n
printf("port : %s",argv[1]);
cout <<port :<<argv[1];
.....
return 0;
}
编译调试后发现 什么都没有输出出来。
查询资料得知 :
printf的内容放在缓冲区里面还没有刷出来,原则上是缓冲区满了以后才输出,成为标准输出流,不过你可以在printf后面加一个fflush(stdout);这样就能立即输出来了,或者加上 \n ;
printf("please set prot , such as you can set 8000 \n" ); // 加上\n
printf("port : %s \n",argv[1]);
cout <<port :<<argv[1]<<endl;
这样就都输出了
读完网友的文字,让我对printf了解更深了。不过,我遇到还不是没有加"\n"的问题。
我在代码中加了"\n",但是在其之前有个".“就变为了”.\n",
就只".\n"组合字符造成了printf死锁。
在.和\n之间加个空格问题就解决了。
奇怪的是我查询了转义字符表,并没有操作转义的地方呢?好奇怪!!
后续:故障原因未找到,问题没有解决!!
写下本文后不久,在之前运行都正常的情况下,再次出现了printf()死锁。
看来printf()死锁有可能是VS2019的问题了。
先写到这里,以后有新的发现再补充。
转义字符表:
c++ 之转义字符
一、转义序列编码
字符名称 ASCII符号 C++代码 十进制 十六进制
二、八进制转义
由 \ + 3 位字符组成,其中字符范围为 0-7 。
ASCII 码表总范围为 \000 - \177,实际上允许 \000 - \377 。
示例:
\323 \042 \04 \177
三、十六进制转义
用 \x + 任意位字符组成,其中字符范围为 0-F , \0X \0x \X 都是错误的前缀。
ASCII 码表总范围为 \x00 - \x7f ,实际上允许 \x00 - \xff 。
示例:
\x13 \xff \x01 \x0000000f
四、多字符输入
最多允许给 char 变量赋值 4 个字节的字符,但 char 变量最终结果为最后字符。
字符串则允许任意多个字节,但是 \0 之后的不被存储计算(char 会计算)。
特殊情况:
在八进制中遇到超出 0-7 范围的字符,或总范围超出 \0000 - \0377 ,则发生截断。
在十六进制中遇到超出 0-F 范围的字符,则发生截断。
在十六进制中遇到总范围超出 \x00 - \xff ,则报错,不会截断读取。
四、int 赋值
当有多个字符的 char 型数据给 int 类型赋值时,为 256 进制。
示例: