【问题标题】:Can I assign a value to argv?我可以为 argv 赋值吗?
【发布时间】:2021-03-09 01:00:03
【问题描述】:

当我使用 vscode 进行 c 和 c++ 调试时,有时需要一些命令行参数(./runFile args1 args2)。如果我直接点击运行,会显示argv[2] out of range。这是因为我没有输入参数。但是如果我通过命令行输入参数,似乎无法单步执行vscode。我想到的方法是我在main函数的开头使用argv[]=value在这里赋值命令行参数。这样使用会不会有问题?而我只能argv[0]=valueargv[1]=value。有没有办法通过argv=...直接给argv赋值?我试过argv[1]=valueargv[2]=value。可以正常运行。这里有风险吗?比如给argv分配多少内存?

【问题讨论】:

  • 你不需要分配给argv。听起来您想要在命令行中未提供参数的默认值。为此,请检查 argc == 1 是否并使用一些硬编码的默认值。不要分配给argv
  • 如果没有传入任何内容,则无法分配argv[1]。在这种情况下,没有存储空间。你可以做什么:提供存储,即分配一个数组char *argv_[] = { argv[0], "arg1", "arg2", nullptr };,然后分配argc = 3; argv = argv_;

标签: c++ c visual-studio-code


【解决方案1】:

我可以给 argv 赋值吗?

是的。

另一件事是你是否应该。不推荐。

例如,为 argv 分配了多少内存?

argv 指向的数组中保证有argc + 1 数量的指针。最后一个是空指针。无法保证会分配更多内存。


附:我没有使用过 vscode,但我怀疑它有一种在其中运行调试器时指定命令行参数的方法。无论如何,大多数 IDE 都可以。如果没有,那么也许您可以使用命令行调试器。

【讨论】:

  • 是的。我忘记了最后的nullptr。 :-) 请注意,OP 的初始前提是通过命令行传递命令行参数是问题所在。因此,在输入main() 之前可能没有足够的可用分配。
【解决方案2】:

当 vscode 运行你的程序时,它使用在一个名为 launch.json 的文件中找到的参数来执行它。

如果您必须:Run -> Open Configurations,则将为该项目打开 launch.json。默认情况下,它看起来像这样:

{
    // Use IntelliSense to learn about possible attributes.
    // Hover to view descriptions of existing attributes.
    // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
    "version": "0.2.0",
    "configurations": [
        {
            "name": "(gdb) Launch",
            "type": "cppdbg",
            "request": "launch",
            "program": "enter program name, for example ${workspaceFolder}/a.out",
            "args": [],
            "stopAtEntry": false,
            "cwd": "${workspaceFolder}",
            "environment": [],
            "externalConsole": false,
            "MIMode": "gdb",
            "setupCommands": [
                {
                    "description": "Enable pretty-printing for gdb",
                    "text": "-enable-pretty-printing",
                    "ignoreFailures": true
                }
            ]
        }
    ]
}

如果您将鼠标悬停在 args 上,它会告诉您:“命令行参数已传递给程序。”

与其在程序启动后尝试修改 argv,不如尝试将您想要的参数放在那里,看看它是否不会像它所说的那样将这些参数传递给您的程序。

【讨论】:

  • 感谢您的回复。这种方法有效。但我不想在每个工作区中生成一个 .vscode。我想使用 .vscode 作为所有工作区的配置。那么有什么方法我不需要经常更改 argv 。例如,参数可以写入文件吗?还是从控制台输入?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-31
  • 2014-07-03
  • 2015-02-04
  • 2019-07-23
  • 2018-01-12
  • 1970-01-01
相关资源
最近更新 更多