Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.60/5: Рейтинг темы: голосов - 5, средняя оценка - 4.60
Excogit8er
2 / 2 / 1
Регистрация: 23.10.2012
Сообщений: 66
Завершенные тесты: 3
#1

Обработка параметров командной строки. Можно ли ещё проще?

19.11.2012, 18:03. Просмотров 819. Ответов 9
Метки нет (Все метки)

Всем доброго дня)

Экспериментировал с параметрами командной строки, хочу сделать так, чтобы в зависимости от установленных параметров, программа выполняла те, или иные действия. Ну, т.е. задаю в командной строке:
prog.exe /Param1 /Param2 /Param3 (и так далее). Далее в зависимости от ключей, сначала "включаются" опции, ну а в соответствии с опциями программа выполняет определенные действия (ключи можно писать как прописными, так и заглавными буквами). Примерно так:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
bool Papam1 = false;
bool Param2 = false;
bool Param3 = false;
 
int main(int argc, char* argv[])
{
   setlocale( LC_ALL,"Russian" );   
 
   for(int i = 0; i < argc; ++i)
   options[i] = argv[i];     
 
   for (int v = 0; v < argc; v++)
    {
if ((options[v][0] == '/') && ((options[v][1] == 'P') || (options[v][1] == 'p'))
 && ((options[v][2] == 'A') || (options[v][2] == 'a')) && ((options[v][31] == 'R') || (options[v][3] == 'r'))
 && ((options[v][4] == 'A') || (options[v][4] == 'a')) && ((options[v][5] == 'M') || (options[v][5] == 'm'))
 && (options[v][6] == '1'))
  Param1 = true;
 
if ((options[v][0] == '/') && ((options[v][1] == 'P') || (options[v][1] == 'p'))
 && ((options[v][2] == 'A') || (options[v][2] == 'a')) && ((options[v][31] == 'R') || (options[v][3] == 'r'))
 && ((options[v][4] == 'A') || (options[v][4] == 'a')) && ((options[v][5] == 'M') || (options[v][5] == 'm'))
 && (options[v][6] == '2'))
  Param2 = true;
 
// ну и так далее...
Но только такие вот if-else конструкции с длинными условными выражениями меня сильно смущают). Как сделать это правильней?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
19.11.2012, 18:03
Ответы с готовыми решениями:

Обработка параметров командной строки
Решение должно представлять собой самостоятельное приложение командной строки,...

функция main обработка параметров командной строки
Подскажите, пожалуйста, зачем могут использоваться параметры командной строки,...

Чтение параметров из командной строки
есть програма которая считает количество строк. написана на с. через командную...

Не получается считать значение параметров из командной строки
Нужно cоставить программу , которая выводит на экран значение функции F(x) в...

Передача параметров командной строки в main(): что происходит в коде?
Здравствуйте. Объясните пожалуйста, что идет в main ? ... printf(&quot;IMAGE...

9
soon
2545 / 1310 / 177
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
19.11.2012, 18:19 #2
http://www.boost.org/doc/libs/1_52_0/doc/html/program_options.html
0
Excogit8er
2 / 2 / 1
Регистрация: 23.10.2012
Сообщений: 66
Завершенные тесты: 3
19.11.2012, 18:29  [ТС] #3
Ага, спасибо. Правда, не уверен, что для такой простенькой задачи, как моя, нужны какие-то парсеры и т.д.
Имя ключа известно, сравнил введенную строку с той, что должна быть - и достаточно.
0
I.M.
567 / 550 / 47
Регистрация: 16.12.2011
Сообщений: 1,389
19.11.2012, 18:31 #4
Excogit8er, можете std::string использовать. Всяко удобнее, чем char[]
Кроме того, даже у чаров есть спец функции для сравнения строк
0
XRuZzz
Антикодер
1491 / 657 / 36
Регистрация: 15.09.2012
Сообщений: 2,663
19.11.2012, 18:32 #5
обычно регулярными выражениями строки обрабатываются. хотя ответ soon-a мне больше нравится(скорее всего boost использует свои средства с регулярными выражениями, для обработки опций)
0
Excogit8er
2 / 2 / 1
Регистрация: 23.10.2012
Сообщений: 66
Завершенные тесты: 3
19.11.2012, 18:41  [ТС] #6
Цитата Сообщение от I.M. Посмотреть сообщение
Excogit8er, можете std::string использовать. Всяко удобнее, чем char[]
Кроме того, даже у чаров есть спец функции для сравнения строк
Да, спасибо, согласен. Через сравнение строк наверное проще и удобнее, чем так:

C++
1
2
3
4
5
6
7
8
9
10
string options[40];
 
for (int v = 0; v < argc; v++) 
 { 
 options[v] = argv[v];   
if ((options[v][0] == '/') && ((options[v][1] == 'P') || (options[v][1] == 'p'))
 && ((options[v][2] == 'A') || (options[v][2] == 'a')) && ((options[v][31] == 'R') || (options[v][3] == 'r'))
 && ((options[v][4] == 'A') || (options[v][4] == 'a')) && ((options[v][5] == 'M') || (options[v][5] == 'm'))
 && (options[v][6] == '1'))
  Param1 = true;
Добавлено через 1 минуту
Цитата Сообщение от XRuZzz Посмотреть сообщение
обычно регулярными выражениями строки обрабатываются. хотя ответ soon-a мне больше нравится(скорее всего boost использует свои средства с регулярными выражениями, для обработки опций)
Я новичок в С++ и не особенно понял даже, как добавлять функционал этого буста в VC10
Скопировать какую-то библиотеку? Хз, короче.
0
BRcr
4015 / 2305 / 291
Регистрация: 03.02.2011
Сообщений: 5,064
Записей в блоге: 10
19.11.2012, 19:02 #7
Все это легко стандартными библиотечками делается:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <algorithm>
#include <ctype.h>
#include <string>
 
//...
 
    using namespace std;
    string str, str_lower;
    bool param1 = false, param2 = false;
    for ( int i = 1; i < argc; ++i ) {
        str = argv[i];
        str_lower.resize( str.size( ) );
        transform( str.begin( ), str.end( ), str_lower.begin( ), tolower );
        str_lower.compare( "param1" ) == 0 ? param1 = true : true;
        str_lower.compare( "param2" ) == 0 ? param2 = true : true;
    }
Добавлено через 5 минут
Вообще-то, даже еще проще, чего это я...
C++
1
2
3
4
5
6
7
8
    string str;
    bool param1 = false, param2 = false;
    for ( int i = 1; i < argc; ++i ) {
        str = argv[i];
        transform( str.begin( ), str.end( ), str.begin( ), tolower );
        str.compare( "param1" ) == 0 ? param1 = true : true;
        str.compare( "param2" ) == 0 ? param2 = true : true;
    }
1
Excogit8er
2 / 2 / 1
Регистрация: 23.10.2012
Сообщений: 66
Завершенные тесты: 3
19.11.2012, 19:20  [ТС] #8
Цитата Сообщение от BRcr Посмотреть сообщение
Все это легко стандартными библиотечками делается:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <algorithm>
#include <ctype.h>
#include <string>
 
//...
 
    using namespace std;
    string str, str_lower;
    bool param1 = false, param2 = false;
    for ( int i = 1; i < argc; ++i ) {
        str = argv[i];
        str_lower.resize( str.size( ) );
        transform( str.begin( ), str.end( ), str_lower.begin( ), tolower );
        str_lower.compare( "param1" ) == 0 ? param1 = true : true;
        str_lower.compare( "param2" ) == 0 ? param2 = true : true;
    }
Добавлено через 5 минут
Вообще-то, даже еще проще, чего это я...
C++
1
2
3
4
5
6
7
8
    string str;
    bool param1 = false, param2 = false;
    for ( int i = 1; i < argc; ++i ) {
        str = argv[i];
        transform( str.begin( ), str.end( ), str.begin( ), tolower );
        str.compare( "param1" ) == 0 ? param1 = true : true;
        str.compare( "param2" ) == 0 ? param2 = true : true;
    }

Красота! Спасибо
Только вот этот момент что-то не понял: "str.compare( "param1" ) == 0 ? param1 = true : true;"
Типа, если введенное значение правильно - то param1 (который bool) выставляем в true.
Если не соответствует - все равно в true? ))
0
BRcr
4015 / 2305 / 291
Регистрация: 03.02.2011
Сообщений: 5,064
Записей в блоге: 10
19.11.2012, 19:58 #9
Цитата Сообщение от Excogit8er Посмотреть сообщение
Если не соответствует - все равно в true? ))
Нет, конечно. Читаем про тернарный оператор.
1
Excogit8er
2 / 2 / 1
Регистрация: 23.10.2012
Сообщений: 66
Завершенные тесты: 3
19.11.2012, 20:13  [ТС] #10
Цитата Сообщение от BRcr Посмотреть сообщение
Нет, конечно. Читаем про тернарный оператор.
Нда. Что-то мне аж стыдно. На самом деле я знаю про тернарный оператор. )) Невнимателен просто)

А решение кстати простое и изящное, я так и подозревал, что не нужно никаких "бустов", парсеров и сторонних библиотек для такого простого примера. Пасибо.
0
19.11.2012, 20:13
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.11.2012, 20:13

Обработка аргументов командной строки
Не нашел где создать тему, поэтому решил здесь. 1. Интересуют стандарты для...

Работа со строками - обработка аргументов командной строки
Помогите реализовать. Буду очень благодарен. Если первый аргумент командной...

Обработка параметров коммандной строки
как обработать несколько параметров для опции? getopt вроде только один берет....


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru