Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 30.03.2012, 15:47   #1
Демик
Форумчанин
 
Аватар для Демик
 
Регистрация: 30.01.2011
Сообщений: 231
По умолчанию Ошибка сегментирования при разборе командной строки

Здравствуйте, есть программа которая разбирает командную строку, эта программа работает, но при определённых значения выдает ошибку сегментирования, помогите пожалуйста разобраться в чем дело.
Вот примеры значений командной строки при котороых программа работает и при которой не работает:
Код:
'/home/demik/lab4pr1.run' -a -d param - Программа работает
'/home/demik/lab4pr1.run' -a -- -b param - Программа выдает ошибку сегментирования.
А вот собственно код:
Код:
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
int main ( int argc , char *argv[] ) {
int checkA=0 ,checkB=0;
char *arg;
for ( int i = 1; i < argc; ++i) {
	if ( argv[i][0] == '-') { 
		if ( argv[i][1] == '-' ) {	
			printf ("Конец разбора ключей\n");
			break;
		}
		else {
			if ( argv[i][1] == 'a')
				checkA = 1;
			if ( argv[i][1] == 'b')
				checkB = 1;
			if ( checkA == 1 && checkB == 1 ) { 
				printf ( "Аргументы -a и -b - не совместимы\n" );
				exit(-1); 
			}	
			if ( argv[i][1] != 'a' && argv[i][1] != 'b' && argv[i][1] != 'd' && argv[i][1] != 'c' ){   			
				printf( "Ключ %s - некорректен\n", argv[i] );
				exit(-2);
		   }
	   }
	}
	else {
		arg = malloc ( strlen ( argv[i] ) +1 );
		strcpy ( arg, argv[i]);
		printf ( "Задан параметр - %s\n", arg );
	}
}
free(arg);
return 0;
}
Злостный анимешнег =^.^=
Демик вне форума Ответить с цитированием
Старый 30.03.2012, 16:20   #2
GreenWizard
мальчик-помогай =)
Форумчанин
 
Регистрация: 16.09.2010
Сообщений: 522
По умолчанию

немного не в тему, но вы сами определить что нужно..
вообще, очень многие программы не поймут ключ "-а -- -b" т.к. считают любой "-" началом нового ключа
сам код тоже очень стрёмный т. к. зачем-то копирует остаток строки как параметр ключа, но это же не верно совсем! необходимо отдельно анализировать и вычленять параметры! именно поэтому ключ "-а --" считается двумя ключами, а не одним... в свою же очередь, верный разбор потребует знания имеет ли ключ параметры или нет, что усложняет код
имхо, ошибка в неверной постановке задачи.. либо запретите указывать "-" в параметрах, либо нормально строку анализируйте

P.S. в С/С++ я новичок, но вы, вроде, затираете значение arg без освобождения ранее выделенной памяти (лишь последнее значение удаляете).... сомневаюсь, что компилятор в строку "arg = malloc(..." добавляет освобождение памяти
GreenWizard вне форума Ответить с цитированием
Старый 30.03.2012, 16:33   #3
Демик
Форумчанин
 
Аватар для Демик
 
Регистрация: 30.01.2011
Сообщений: 231
По умолчанию

Спасибо, я понял, что вы имели в виду. А по поводу malloc и free, я покачто сам мало знаю, но в книге вроде так было написано = ).
Не мог бы мне кто нибудь подсказать, как можно сделать так, что бы
При вводе вот этой строки:
Код:
'/home/demik/lab4pr1.run' -a -- -b param
Программа принимала бы ключ -a, заканчивала разбор ключей и начинала обрабатывать параметры?
Злостный анимешнег =^.^=

Последний раз редактировалось Демик; 30.03.2012 в 16:38.
Демик вне форума Ответить с цитированием
Старый 30.03.2012, 17:20   #4
GreenWizard
мальчик-помогай =)
Форумчанин
 
Регистрация: 16.09.2010
Сообщений: 522
По умолчанию

вариант в лоб
параметры: -а -- -b
действия:
1) натыкаемся на -
2) смотрим что идёт до первого пробела... это имя ключа
3) имя у нас "а" и мы знаем, что после него всегда идёт некий аргумент т. е. разбираем аргумент
3.а) смотрим что после имени ключа и пробела
3.б) если это кавычки, то ищем закрывающие кавычки
3.в) если это любой другой символ, то сохраняем его и все след. символы, пока не дойдём до конца строки или до "(пробел)-"

обработку параметров лучше вынести в функцию, которая возвращаем длину параметра.... тогда мы просто начинаем искать след. ключ с позиции после параметра

тут один важный нюанс: это когда комм. строка доступна как строка, а не массив (очень сомневаюсь, что для С++ это проблема).. если же мы обращаемся через argv, то тут, думаю, достаточно парами обращаться т. е. в argv[i] ключ, а в argv[i + 1] параметр его
тупо выведите на экран содержимое argv и там уже станет ясно, как оно разбивает строку на части, а уже из этого станет ясно как Вам их "спаривать" в пары ключ-параметр
GreenWizard вне форума Ответить с цитированием
Старый 30.03.2012, 23:01   #5
Демик
Форумчанин
 
Аватар для Демик
 
Регистрация: 30.01.2011
Сообщений: 231
По умолчанию

Спасибо, буду пробовать.
Злостный анимешнег =^.^=
Демик вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Не работает код, вылетает ошибка сегментирования Avitella Общие вопросы C/C++ 6 21.12.2011 22:20
Ошибка сегментирования при вызове strcat Кипящий чайник Общие вопросы C/C++ 4 05.03.2011 20:49
Ошибка сегментирования Olechka555 Общие вопросы C/C++ 1 14.09.2010 08:50
передача параметров программе при запуске из командной строки shurik_7866 Общие вопросы Delphi 3 03.06.2009 18:23
Типы аргументов при перегрузке функций Arkuz Общие вопросы C/C++ 4 24.02.2009 01:16