У меня есть следующий код:
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 не работает. Есть идеи почему?
Просто, если вы не отправляете аргументы в программу, тогда 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;
}
argv это массив. Когда вы пытаетесь индексировать в массив за последним элементом, вы получаете segfault. Чтобы не проходить мимо последнего элемента, проверьте значение argc, а argc — 1 будет индексом последнего элемента, к которому вы можете получить доступ. Больше на segfaults здесь: http://en.wikipedia.org/wiki/Segmentation_fault
причина
exampleProgram -e < a.txt
работает и
exampleProgram < a.txt
не
потому что когда в программу не передается аргумент, где нет argv[1]
, это выходит за пределы массива args. что нужно сделать перед тестированием argv[1]
это проверка, чтобы увидеть, есть ли так много аргументов для начала.
Например:
if (argc > 1) {
if(strcmp(argv[1],"-e")==0) {
}
}
argc
используется для хранения количества аргументов в программе, поэтому вы можете проверить это перед выходом за пределы.