如何测试 argc,然后将默认值分配给 argv[1]

how can I test argc and then assign default values to argv[1]?

本文关键字:分配 默认值 argv 然后 何测试 测试 argc      更新时间:2023-10-16

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

如果没有输入参数,我需要程序为 null 终止符设置 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] = '';//add a null terminator to our argv argument, so it can be used with the atoi function
    }

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

重构代码:(基本上只是围绕问题进行编码,这样我们就不必在主函数中操作 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;

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

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

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

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

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[]
}

只是为了支持你的问题,你想要的东西没有错误,但你忘记在你想要分配值的地方分配内存。
检查这个:

#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"));
        argv[1][0] = '1';
        argv[1][1] = '';
        //argv[1][2] = '';
        //argv[1] = '';//add a null terminator to our argv argument, so it can be used with the atoi function
    }
}

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