【问题标题】:how can I test argc and then assign default values to argv[1]?如何测试 argc 然后将默认值分配给 argv[1]?
【发布时间】:2015-01-13 05:40:05
【问题描述】:

如果没有输入参数,我需要为命令行应用程序提供默认行为。

如果没有输入任何参数,我需要程序为空终止符设置 argv[1][0] = '1' 和 argv[1][1] = '\0'。

当我尝试在 g++ 中编译我的代码时,我不断收到核心转储,这就是导致问题的原因:

int main(int argc, char * argv[]){


    //for testing we put some dummy arguments into argv and manually set argc
    //argc = 1;//to inlcude the program name 

    //we put a defualt value into argv if none was entered at runtime
    if(argc == 1){
        argv[1][0] = '1';
        argv[1][1] = '\0';//add a null terminator to our argv argument, so it can be used with the atoi function
    }

另外,我不在 C++ 11 上。

重构代码:(基本上只是围绕问题编写代码,这样我们就不必在主函数中操作 argv[])

int argvOneAsInt;
        if(argc != 1){
            argvOneAsInt = atoi(argv[1]);//use atoi to convert the c-string at argv[1] to an integer
        }
        else{
            argvOneAsInt = 1;

【问题讨论】:

  • 您应该将参数复制到变量并在程序中使用它们。如果没有提供参数,那么很容易设置变量。
  • 如果没有提供任何参数,那么您认为argv[1] 指向什么?提示std::vector<std::string> args(argv, argv + argc); 现在你可以用它做你想做的事了。
  • 您需要复制一份argv。这将允许您使用默认值。因此,将本地 argv 变量设为默认值,然后将 argv 值从 main 参数复制到本地 argv 变量中。

标签: c++ g++ argv argc


【解决方案1】:

只是为了支持您的问题,您想要的不是错误的,但是您忘记在要分配值的位置分配内存。
检查这个:

#include <string.h>
#include <malloc.h>

using namespace std;

int main(int argc, char * argv[]){
    //for testing we put some dummy arguments into argv and manually set argc
    //argc = 1;//to inlcude the program name 

    //we put a defualt value into argv if none was entered at runtime
    if(argc == 1){
        argv[1] = (char*)malloc(strlen("1\0"));
        argv[1][0] = '1';
        argv[1][1] = '\0';
        //argv[1][2] = '\0';
        //argv[1] = '\0';//add a null terminator to our argv argument, so it can be used with the atoi function
    }
}

现在它应该按照你想要的方式工作了。

【讨论】:

  • 如果有多个附加参数怎么办?
  • 我认为最重要的一点应该是让 OP 清楚为什么他的程序不起作用。如果 OPs 询问一些不合逻辑或不可能的事情,那么我们可以提供一些其他方法来完成他的任务。 @NeilKirk 很明显,总会有一些不同的方式。
【解决方案2】:

这一切看起来相当狡猾。我可能会这样做:

int main(int argc, char* argv[])
{
    std::string arg1 = "1"; // set default

    if(argc > 1) // override default if present
        arg1 = argv[1];

    // Now use arg1 and forget about argv[]
}

【讨论】:

    【解决方案3】:

    如果 argc 等于 1,则数组 argv 中的第二个值为 NULL。您在此处取消引用该 NULL 指针:

    argv[1][0] = '1';
    

    与其尝试操纵 argv,不如更改代码中的逻辑。使用您在内存中控制的数组,将 argv 复制到其中,然后操作该数组。

    【讨论】:

    • 你确定它是空的而不是未定义的吗?
    • @NeilKirk 是的,argv[argc] 是 NULL,你会得到 ub 试图取消引用它。多么荒谬的反对票......
    • 我当然可以改变我的逻辑,但如果我需要的话,我也想知道如何正确地将 char 值添加到 argv。
    • 有趣,我检查了两个编译器,它确实为空!我不知道。
    • @NeilKirk,标准 N3337 § 3.6.1 [basic.start.main]:“argv[argc] 的值应为 0。[注意:建议进一步 (可选)在 argv 之后添加参数。—end note ]"
    猜你喜欢
    • 1970-01-01
    • 2021-02-14
    • 1970-01-01
    • 2011-04-15
    • 1970-01-01
    • 2016-05-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多