Как я могу проверить argc и затем назначить значения по умолчанию для argv[1]?

Мне нужно дать поведение по умолчанию для приложения командной строки, если не введены аргументы.

Если аргументы не введены, мне нужно, чтобы программа установила 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.

RE-FACTORED CODE: (который в основном просто кодирует проблему, чтобы нам не приходилось манипулировать 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;

3 ответа

Решение

Если 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\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
    }
}

теперь это должно работать так, как вы хотите.

Другие вопросы по тегам