如何写入我正在使用C/C++扩展在VS Code中运行/调试的C/C++程序的标准输入?

yptwkmov  于 12个月前  发布在  C/C++
关注(0)|答案(7)|浏览(282)

目前,我正在尝试用Visual Studio代码编写C/C++程序。为此,我安装了两个扩展:C/C++C++ Intellisense
根据文档,调试工具不适用于windows。我已经能够构建和运行代码,执行以下任务:

{
    "version": "0.1.0",
    "command": "cmd",
    "isShellCommand": true,
    "args": [
        "/C"
    ],
    "tasks": [
        {
            "taskName": "Makefile",
            "suppressTaskName": true,
            // Make this the default build command.
            "isBuildCommand": true,
            // Show the output window only if unrecognized errors occur.
            "showOutput": "always",
            // No args
            "args": [
                "C:/Programs/cygwin/bin/make.exe",
                "all"
            ],
            // Use the standard less compilation problem matcher.
            "problemMatcher": {
                "owner": "cpp",
                "fileLocation": [
                    "relative",
                    "${workspaceRoot}"
                ],
                "pattern": {
                    "regexp": "^(.*):(\\d+):(\\d+):\\s+(warning|error):\\s+(.*)$",
                    "file": 1,
                    "line": 2,
                    "column": 3,
                    "severity": 4,
                    "message": 5
                }
            }
        },
        {
            "taskName": "Run",
            "suppressTaskName": true,
            "isTestCommand": true,
            "args": [
                "helloworld"
            ]
        }
    ]
}

字符串
一个简单的Makefile

all: clean helloworld

helloworld: helloworld.cpp
    C:/Programs/cygwin/bin/g++ helloworld.cpp -o helloworld

clean:
    C:/Programs/cygwin/bin/rm -rf helloworld


但是,问题出现了,当程序在运行时需要一些用户输入时。假设对于这个非常熟悉的helloworld程序。

# include <iostream>

using namespace std;

int main ()
{
  int name;

  cin >> name;

  cout << "Hello, " << name << "!!!" << endl;

  return 0;
}


你能帮我在运行时获取用户输入吗?有一个解决方案可以将输入作为命令行参数传递。但是,对于具有复杂流程的程序来说,这是不可能的。

v440hwme

v440hwme1#

转到Code -> Preferences -> Settings并添加自定义设置:

{
   "code-runner.runInTerminal": true
}

字符串
最后运行你的c++代码,你将能够在控制台中输入值

fslejnso

fslejnso2#

转到设置(code-runner+,)->搜索设置->:Code-runner:在终端中运行-选中此选项,您将能够直接在接受输入的终端中运行代码。

xpcnnkqh

xpcnnkqh3#

确保你的VS代码中安装了代码运行器。
从顶部选择:文件>首选项>设置
在设置中搜索代码运行器并选中该框:


的数据
默认情况下,它保持未选中状态。您必须启用它才能在终端中运行您的首选语言。

mdfafbf1

mdfafbf14#

作为一个额外的便利,您还可以从注解向集成终端提供输入。
范例:

# include <iostream>
using namespace std;
int main ()
{
  int name;
  cin >> name;
  cout << "Hello, " << name << "!!!" << endl;
  return 0;
}
/*input
123
*/

字符串
延伸链接--
注解输入:https://marketplace.visualstudio.com/items?itemName=virresh.cinp
注意事项:这个扩展依赖于code-runner,另一个可以运行几乎所有语言的脚本的扩展(你也可以指定自定义构建选项)
免责声明:我是这个扩展的作者

eblbsuwk

eblbsuwk5#

进入“设置”,搜索“代码运行器:运行在终端”,并检查它。这就是我如何修复它。

tjrkku2a

tjrkku2a6#

唉。几乎这里的每一个答案都是关于Code Runner扩展的,这篇问题帖子非常清楚地说明它使用的是C/C++扩展而不是Code Runner,老实说,自从ms-vscode.cpptools扩展添加了自己的运行按钮并支持调试以来,Code Runner在我眼中没有多大价值。
如果你不知道我说的“任务”或“启动配置”是什么意思,我建议你先看看the docs on tasks,启动配置文件和the docs for configuring C++ debugging

如果您使用的是macOS

我认为你需要使用cppdbg启动配置,如果你使用"request": "launch",或者使用附件("request": "attach"),则将其externalConsole属性设置为true。请参阅该属性文档的以下片段:
当设置为false时,输出可以在VS Code的debugConsole中看到。由于lldb-mi的限制,integratedTerminal支持不可用。
我认为通过调试控制台不支持写入程序的标准输入。

Windows或Linux

(免责声明:我已经在Linux上测试过这些信息,但没有在Windows上测试过。欢迎反馈。如果我有时间和动力,也许我也会在Windows上测试)

如果您没有配置构建任务或启动配置

然后单击运行/调试按钮(它的形状像一个播放按钮,并有一个可在“运行C/C文件”或“运行C/C”文件之间切换的菜单),这是C/C扩展在工作台右上角的操作按钮条中提供的(如果您在命令面板中运行C/C++: Run C/C++ File/C/C++: Debug C/C++ File,效果相同)将提示您“选择调试配置”,在这一点上,它将提供一个内置/检测到的启动配置的列表,可以用于基本的调试目的,如:
C/C
:构建和调试活动文件(preLaunchTask:C/C++构建活动文件)
检测到的任务:(编译器:)
选择你想要使用的编译器。程序将运行(如果你选择使用调试器运行),并且将创建/使用两个integrated terminal示例-一个用于构建任务(“preLaunchTask”),名为“build active file”,另一个用于运行你的程序,名为“cppdbg:“。运行你的程序的终端是你可以为程序的标准输入流写东西的地方。

如果您配置了 default 构建任务,但没有启动配置

然后运行按钮和相应的命令将只使用该构建任务和适合它的通用启动配置。你很可能希望构建任务不硬编码特定的文件名,除非你希望运行按钮或相应的命令只运行/调试一个特定的文件,而不管当前关注/活动的文件是什么。
同样的情况也适用:检查终端面板。那里应该有一个终端示例在等着你。

如果使用启动配置

答案和上面的差不多。如果你有一个默认的构建任务,则使用该任务作为其preLaunchTask的第一个启动配置。如果没有默认的构建任务,或者默认的构建任务是在the user-level tasks.json file中定义的,则会提示你使用哪个启动配置。
转到集成终端面板。那里有一个终端示例,您可以在其中写入正在运行的程序的标准输入-也就是说,除非:

  • 您在启动配置中使用文件重定向将文件重定向到程序的标准输入(例如启动配置中的"args": ["<", "input_file.in"]),
  • 或者你把"externalConsole": true放在你的启动配置中,在这种情况下,一个外部控制台将被启动。设置,我不确定这里是否使用。

如果您使用的是CMake工具

同样的道理(它集成了C/C++扩展)。检查终端面板。您应该看到一个标题为“cppdbg:“的示例。如果您使用调试运行,您还可以使用cmake.debugConfig设置执行文件重定向和externalConsole等操作。

lfapxunr

lfapxunr7#

如果你遇到同样的问题,我的integratedTerminal无法读取输入从用户如下挂起(env. windows 10)x1c 0d1x
我的解决方案是将cygwin的gdb和g ++替换为mingw 64
然后输入/输出是正常的

相关问题