起因
开始学习c语言了,一开始想的就是直接装个VS就完了,但是一搜都是说vs臃肿啥啥不好,不如用vscode来整,多轻量~于是就网上搜了许多教程开整了,期间也遇到了一些常见的坑,这些集中写个文,希望可以帮助到大家。配置文件也是来自其他文章的,我也进行了部分修改,后面会标出。
解决方法
我们知道使用vscode对c/c++进行调试的本质是这样的——1.GCC编译代码,2.vscode运行编译出的程序。因此调试运行程序一闪而过的本质就是命令行程序运行完结果直接自动关闭了,这和c/c++程序本身也有关系。
所以对于这种问题,我们可以很自然而然的想到两种解决方法:
A.在控制台中直接运行该程序原理:
我们直接打开cmd/powershell等,输入对应程序的地址,运行即可。我们不想让他一闪而过的原因是我们需要看到输出结果,而不是程序单纯的运行一下就完事儿了,因此这样就行了,但是每次都打开cmd似乎也太麻烦了,因此我们也可以在vscode上实现这个功能。
前面说过一般我们用vscode调试c/c++的过程,这里细化一下,大概是这样的:vscode先从launch.json中根据启动参数进行调试,其中我们配置了preLaunchTask这个参数调用task.json中的任务,一般在task.json中配置一个任务调用gcc进行编译。
因此我们只需要在launch中配置一个cmd程序来打开我们task.json中任务编译的结果就可以了,但是这种调用下还是会出现闪退的问题,因此我们补充一个pause指令;同时也发现了另一个问题,pause指令的”按任意键继续……”并没用自动换行,反而和输出内容在一起,于是我们在补充一个“echo.”用作换行符。
因此我们完整的指令是这样的
/C yourprogram.exe
echo.
pause
解决方法:
如果放到launch.json文件中则是这样的。
{ "version": "0.2.0", "configurations": [ { "name": "(Windows) Launch", "type": "cppvsdbg", "request": "launch", "program": "cmd", "preLaunchTask": "echo",//这里需要换成你task.json中的任务名 "args": [ "/C", "${fileDirname}\\${fileBasenameNoExtension}.exe", "&", "echo.", "&", "pause" ], "stopAtEntry": false, "cwd": "${workspaceFolder}", "environment": [], "externalConsole":true } ] } ] }
需要说明的是,这并不是一个完美的解决方案,在这种情况下断点调试是没用的。
B.添加一些代码实现解决方法
a.程序结尾处加getchar();一个不行(比如前面有scanf之类的函数使用,就会在缓冲区读取字符,结果还是会自动关闭)就加俩,俩不行就……
b.先清除缓冲区,再getchar();
while(getchar()!='\n') //这两句代码是清空输入缓冲区内容,等同于fflush(stdin); continue; getchar();
c.方法A中的原理一样,只不过改成了在程序本身执行。
#include <stdlib.h> system("pause");
C.在代码结尾处添加断点
前面我们说了,方法A中并不能使用调试功能。而在你能正常使用调试功能的前提下,可以直接在代码结尾处断点解决。
写在最后
需要说明的是,除了你代码中解决闪退问题,否则如果你直接打开编译完的exe,大概率也会直接闪退。以上内容是在windows环境下的,其他系统可能略有差异。
我个人而言,我更喜欢方法A,但是需要调试的场景下,我则切换到普通的启动方式通过断点来解决这个问题。
最后提供我的两份json文件以供各位参考:
launch.json:
{ "version": "0.2.0", "configurations": [ { "name": "(Windows) Launch", "type": "cppvsdbg", "request": "launch", "program": "cmd", "preLaunchTask": "echo", "args": [ "/C", "${fileDirname}\\${fileBasenameNoExtension}.exe", "&", "echo.", "&", "pause" ], "stopAtEntry": false, "cwd": "${workspaceFolder}", "environment": [], "externalConsole":true }, { "name": "(gdb) Launch", "type": "cppdbg", "request": "launch", "program": "${workspaceFolder}/${fileBasenameNoExtension}.exe", "args": [], "stopAtEntry": false, "cwd": "${workspaceFolder}", "environment": [], "externalConsole": true, "MIMode": "gdb", "miDebuggerPath": "F:\\mingw\\bin\\gdb.exe",// 自己电脑的gdb "preLaunchTask": "echo",//这里和task.json的label相对应 "setupCommands": [ { "description": "Enable pretty-printing for gdb", "text": "-enable-pretty-printing", "ignoreFailures": true } ] } ] }
task.json
{ // See https://go.microsoft.com/fwlink/?LinkId=733558 // for the documentation about the tasks.json format "version": "2.0.0", "tasks": [ { "label": "echo", "type": "shell", "command": "gcc", "args": [ "-g", "${file}", "-o", "${fileBasenameNoExtension}.exe", "-fexec-charset=GBK"//解决中文乱码 ] } ], "presentation": { "echo": true, "reveal": "always", "focus": false, "panel": "shared", "showReuseMessage": true, "clear": false } }
如果你需要更详细的安装教程,csdn上已经有很多完整的文章了,这里我就不多赘述了。
以下是参考到的资料,实际上还有更多,但是已经无法一一标注了,如果有任何问题欢迎直接联系我。
参考资料:
https://bs.csdn.net/topics/370159790
https://blog.csdn.net/weixin_43434136/article/details/106884469
(悄咪咪问下我的"externalConsole": true关掉后在内置的powershell中打开并没有输出也不能输入,google后好像发现是本身的一个bug? ps英文输入法下也是如此,有的人说是中文输入法。不知道有没有大神有方法解决。。。)