小细节“./n“造成的 printf()死锁

在Windows 10环境下使用Visual C++ 2019开发控制台程序时,遇到了printf函数导致程序死锁的问题。经过排查,发现特定的字符组合会导致该问题出现,通过简单的修改解决了此现象。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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 进制。

示例:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值