LINUX.ORG.RU

Обработка argv

 , ,


1

1

Здравствуйте:)

Возник вопрос о том, как лучше [правильнее, элегантнее] обрабатывать параметры, передаваемые приложению из командной строки, вида

$ myapp -s -f
Пока что завел под каждый из параметров по одной переменной, то есть:
bool safeMode;
if(argv[1] == '-s') {
    safeMode = true;
} else {
    safeMode = false;
}
Как будет считаться правильнее?



Последнее исправление: Klymedy (всего исправлений: 1)

Какое-то время не прогаю на C, но man getopt точно надо бы сделать.

Еще, кажется, есть забавная штука gengetopt, или как-то так.

Quickern ★★
()
Ответ на: комментарий от wakuwaku

Да, а что насчет хранения этих параметров? Стоит ли заводить переменные для этого, или все же каждый раз искать аргумент в argv?

Daiquiri
() автор топика

Я делаю приблизительно так:

bool verbose = false;
for(int i = 1; i < argc; i++)
{
  if(!strncmp(argv[i], "-v", 2))
  {
    verbose = true;
  }
}
andreyu ★★★★★
()

Язык не указан, но лучше будет взять библиотеку. Для плюсов - boost::program_options.

DarkEld3r ★★★★★
()

А я себе навелосипедил обертку над getopt. Удобна тем, что "автоматом" умеет вложенные параметры (как у mplayer типа --param par1=val1:par2=val2 и т.п.) и генерирует help (т.к. определение каждого параметра еще и включает в себя строчку справки). Собственно, ради хелпа и писалось, т.к. я частенько забывал привести хелп в актуальное состояние по параметрам.

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от anonymous

=D

Я только сейчас обратил внимание, а уже:

locate  parceargs.c | wc -l
15
это меня, наверное, parcellite с толку сбила!

Eddy_Em ☆☆☆☆☆
()

можно например вот так например:

http://minnie.tuhs.org/cgi-bin/utree.pl?file=V2/cmd/fc.c

	while(++i < argc) {
		if (getsuf(t=copy(argv[i])) == 'f') {
			printf("%s:\n", t);
			av[0] = "fc";
			av[1] = t;
			av[2] = 0;
			if(callsys("/usr/fort/fc1", av) == 0) {
				av[0] = "as";
				av[1] = "-";
				av[2] = "f.tmp1";
				av[3] = 0;
				callsys("/bin/as", av);
				setsuf(t);
				unlink(t);
				if(link("a.out", t) | unlink("a.out")) {
					printf("move failed: %s\n", t);
					return;
				}
			} else {
				cflag++;
				goto loop;
			}
		} else if (*t == '-' & t[1] =='c') {
			cflag++;
			goto loop;
		}
		if (nodup(llist, t)) {
			llist[nl++] = t;
			llist[nl] = 0;
		}
loop:;
	}

qulinxao ★★☆
()
Ответ на: комментарий от Eddy_Em

других сюрпризов не будет?

впрочем, зачем я спрашиваю? ☺

emulek
()
Ответ на: комментарий от Eddy_Em

Ааа! Они стырили мою идею: генерировать хелпы описанием ключей!

Воспользовавшись для этого машиной времени! Какое коварство!

i-rinat ★★★★★
()
Ответ на: комментарий от qulinxao

Да? А я думал, ты гостья из прошлого. А ты, значит, простой криптозоолог.

Может откроешь свою уютную тему, туда и будешь складывать находки?

emulek
()
Ответ на: комментарий от qulinxao

ну ТС ведь сам видит, что от его кода смердит, пришёл спросить.

А ты с какой целью копролитами тему забросал? Хоть бы подождал, пока я позавтракаю!

emulek
()
Ответ на: комментарий от wakuwaku

кстати и об этом как раз(глава 1 введение и ссылка на туже http://minnie.tuhs.org/cgi-bin/utree.pl): глава 2. Аргументы опции и переменные окружения.

2.3 Разбор опций: getopt() и getopt_long()................................ 43

в годной(ТС'у) книжке-руководстве-текстбуке Арнольд Роббинск Linux программирование в примерах

qulinxao ★★☆
()
Ответ на: комментарий от CYB3R

Еще я в глибовском говне не ковырялся! Хуже библиотеку и представить страшно! (про культи умалчиваю, т.к. культи на быдлоплюсерах)

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от anonymous

А int вместо size_t в глаза не бросился?

не выспался, да.

но это имя опции, где ты видел опции, у которых длинна 2^31 байт?

emulek
()
Ответ на: комментарий от CYB3R

Ради чего? У меня почти на все случаи жизни есть свои велосипеды, а если еще нет, то навелосипежу. Но пользоваться этим дерьмищем я не собираюсь! Еще мне ООПщины не хватало в сишечке!

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от emulek

но это имя опции, где ты видел опции, у которых длинна 2^31 байт?

Если выставить этот код в продакшен, найдутся кулхацкеры которые передадут опции нужной длины.

anonymous
()
Ответ на: комментарий от anonymous

Если выставить этот код в продакшен, найдутся кулхацкеры которые передадут опции нужной длины.

сдуру можно и хрен сломать

emulek
()
Ответ на: комментарий от anonymous

Почему «сдуру»? Уязвимости ищут целенаправленно.

включи голову, и подумай: ИМЯ опции. Не сама опция, а её ИМЯ. Ну например

ls --group-directories-first
очень длинная опция. Ажно 24 байта. А надо 2147483648. Заметь, злоумышленник должен сам код писать, что-бы поиметь сам себя в ухо через Гваделупу, с Юпитера.

Единственное, о чём это говорит, так это о том, что Эдди _потенциально_ _может_ так накосячить. А может он нас троллит?

emulek
()

Как будет считаться правильнее?

while ((ch = getopt(argc, argv "sf")) != -1) {
        switch (ch) {
        case 's':
                safeMode = 1;
                break;
        case 'f':
                whatever = 1;
                break;
        }
}
beastie ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.