Как я могу проверить 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
}
}
теперь это должно работать так, как вы хотите.