argv [1] дает ошибки

У меня есть следующий код:

int main(int argc, char *argv[])
{
if(strcmp(argv[1],"-e")==0)
{
//perform code
}

//code if argv[1] is not "-e"
return 0;
}

Когда я выношу все, если заявление:

if(strcmp(argv[1], "-e")==0)

мой код, если strcmp (argv [1], «-e») == 0) не является «-e», работает нормально. Но когда я оставляю его, мой код работает только тогда, когда приведенное выше выражение if выдает true. Любые идеи о том, почему это может произойти? Например:

Если я скомпилирую с argv [1] без комментариев:

// пример программы будет исполняемым

exampleProgram -e < a.txt работает, но exampleProgram < a.txt не работает. Есть идеи почему?

0

Решение

Просто, если вы не отправляете аргументы в программу, тогда args[1] не существует, и вы пытаетесь получить доступ к неназначенной позиции в памяти.

Вы можете сделать что-то вроде этого:

int main(int argc, char *argv[])
{
if(argc > 1 && strcmp(argv[1],"-e")==0)
{
//perform code
}

//code if argv[1] is not "-e"
return 0;
}
2

Другие решения

argv это массив. Когда вы пытаетесь индексировать в массив за последним элементом, вы получаете segfault. Чтобы не проходить мимо последнего элемента, проверьте значение argc, а argc — 1 будет индексом последнего элемента, к которому вы можете получить доступ. Больше на segfaults здесь: http://en.wikipedia.org/wiki/Segmentation_fault

1

причина
exampleProgram -e < a.txt работает и
exampleProgram < a.txt не
потому что когда в программу не передается аргумент, где нет argv[1], это выходит за пределы массива args. что нужно сделать перед тестированием argv[1] это проверка, чтобы увидеть, есть ли так много аргументов для начала.

Например:

if (argc > 1) {
if(strcmp(argv[1],"-e")==0) {

}
}

argc используется для хранения количества аргументов в программе, поэтому вы можете проверить это перед выходом за пределы.

0
По вопросам рекламы [email protected]