c++使用cin或getchar()时窗口不等待用户输入

近期遇到一个奇怪的问题,写了一段很简单的窗口输入代码

char a;
std::cin>>a;
std::cout<<"a:"<<a<<endl;

但是运行的时候,cin这边根本没有停下来等待用户输入,直接跳过了,下面打印也是空。

经过排查,发现之前tcp连接的时候调用了一句代码。简化代码如下:

int m_socket;
close(m_socket);

m_socket没有初始化,就直接调用了close。在调用close之前,cin是好的。调用close之后,cin就不等待了。很奇怪。

最后将close这边屏蔽掉,问题解决。

### VSCode调试C++程序控制台窗口一闪而过的原因 当在VSCode中调试C/C++程序遇到控制台窗口快速关闭的情况,主要原因是命令行程序运行完毕后会立即退出并关闭窗口。这种行为并非由IDE本身引起,而是由于编译后的可执行文件完成其工作后自然终止所致[^1]。 ### 解决方案概述 存在多种方式可以有效防止这种情况发生: #### 方法一:修改launch.json配置 通过调整`launch.json`中的设置来保持终端开放直到用户手动关闭是最推荐的做法之一。具体操作如下所示,在`.vscode/launch.json`文件内加入更改相应字段以确保程序结束后会立刻消失: ```json { "version": "0.2.0", "configurations": [ { "name": "(gdb) Launch", "type": "cppdbg", "request": "launch", "program": "${workspaceFolder}/your_program_name.exe", // 替换为实际路径 "args": [], "stopAtEntry": false, "cwd": "${fileDirname}", "environment": [], "externalConsole": true, // 使用外部控制台而非内置面板 "MIMode": "gdb", "setupCommands": [ { "description": "Enable pretty-printing for gdb", "text": "-pretty-printing", "ignoreFailures": true } ], "preLaunchTask": "gcc build active file", // 如果有预构建任务则指定这里 "miDebuggerPath": "/path/to/gdb", // GDB安装位置(Linux/MacOS) "internalConsoleOptions": "neverOpen" } ] } ``` 此方法允许开发者利用独立于编辑器之外的标准CMD/Powershell作为输出界面,并且只有当使用者主动结束进程才会真正意义上的“关闭”。 #### 方法二:添加暂停指令 另一种简单直接的方法就是在源码最后面增加一条等待输入的语句,比如使用标准库函数`getchar()`者调用系统的`pause`命令。需要注意的是后者依赖于操作系统环境变量PATH中能找到对应解释器的位置;而对于跨平台开发来说可能是最佳选择。 对于Windows系统而言可以在代码结尾处插入以下片段实现相同效果而必担心兼容性问题: ```cpp #include <iostream> using namespace std; int main(){ cout << "Hello World!" << endl; char ch; cin >> ch; // 者更简洁的方式: getchar(); return 0; } ``` 这种方法适用于小型练习项目是学习阶段,但对于大型应用并建议采用这种方式处理UI逻辑。 #### 方法三:设置断点 如果只是单纯想要查看某次特定执行的结果,则可以直接在返回值之前设置一个断点让调试器在此停留下来供观察数据流状态变化情况。这样既需要改动任何现有业务流程也影响最终产物的质量特性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值