Форум программистов, компьютерный форум CyberForum.ru

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

Восстановить пароль Регистрация
 
Excogit8er
2 / 2 / 0
Регистрация: 23.10.2012
Сообщений: 66
19.11.2012, 18:03     Обработка параметров командной строки. Можно ли ещё проще? #1
Всем доброго дня)

Экспериментировал с параметрами командной строки, хочу сделать так, чтобы в зависимости от установленных параметров, программа выполняла те, или иные действия. Ну, т.е. задаю в командной строке:
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 конструкции с длинными условными выражениями меня сильно смущают). Как сделать это правильней?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
19.11.2012, 18:03     Обработка параметров командной строки. Можно ли ещё проще?
Посмотрите здесь:

C++ Чтение параметров из командной строки
C++ нужно решить как можно проще
Обработка параметров командной строки C++
Можно ли это написать как то проще C++
C++ можно написать ее как то проще ?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
soon
 Аватар для soon
2536 / 1301 / 81
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
19.11.2012, 18:19     Обработка параметров командной строки. Можно ли ещё проще? #2
http://www.boost.org/doc/libs/1_52_0...m_options.html
Excogit8er
2 / 2 / 0
Регистрация: 23.10.2012
Сообщений: 66
19.11.2012, 18:29  [ТС]     Обработка параметров командной строки. Можно ли ещё проще? #3
Ага, спасибо. Правда, не уверен, что для такой простенькой задачи, как моя, нужны какие-то парсеры и т.д.
Имя ключа известно, сравнил введенную строку с той, что должна быть - и достаточно.
I.M.
 Аватар для I.M.
564 / 547 / 5
Регистрация: 16.12.2011
Сообщений: 1,389
19.11.2012, 18:31     Обработка параметров командной строки. Можно ли ещё проще? #4
Excogit8er, можете std::string использовать. Всяко удобнее, чем char[]
Кроме того, даже у чаров есть спец функции для сравнения строк
XRuZzz
Антикодер
577 / 478 / 23
Регистрация: 15.09.2012
Сообщений: 2,429
19.11.2012, 18:32     Обработка параметров командной строки. Можно ли ещё проще? #5
обычно регулярными выражениями строки обрабатываются. хотя ответ soon-a мне больше нравится(скорее всего boost использует свои средства с регулярными выражениями, для обработки опций)
Excogit8er
2 / 2 / 0
Регистрация: 23.10.2012
Сообщений: 66
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
Скопировать какую-то библиотеку? Хз, короче.
BRcr
 Аватар для BRcr
4003 / 2292 / 155
Регистрация: 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;
    }
Excogit8er
2 / 2 / 0
Регистрация: 23.10.2012
Сообщений: 66
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? ))
BRcr
 Аватар для BRcr
4003 / 2292 / 155
Регистрация: 03.02.2011
Сообщений: 5,064
Записей в блоге: 10
19.11.2012, 19:58     Обработка параметров командной строки. Можно ли ещё проще? #9
Цитата Сообщение от Excogit8er Посмотреть сообщение
Если не соответствует - все равно в true? ))
Нет, конечно. Читаем про тернарный оператор.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.11.2012, 20:13     Обработка параметров командной строки. Можно ли ещё проще?
Еще ссылки по теме:

функция main обработка параметров командной строки C++
Числа Каталана,можно ли проще? C++
Обработка параметров коммандной строки C++

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

Или воспользуйтесь поиском по форуму:
Excogit8er
2 / 2 / 0
Регистрация: 23.10.2012
Сообщений: 66
19.11.2012, 20:13  [ТС]     Обработка параметров командной строки. Можно ли ещё проще? #10
Цитата Сообщение от BRcr Посмотреть сообщение
Нет, конечно. Читаем про тернарный оператор.
Нда. Что-то мне аж стыдно. На самом деле я знаю про тернарный оператор. )) Невнимателен просто)

А решение кстати простое и изящное, я так и подозревал, что не нужно никаких "бустов", парсеров и сторонних библиотек для такого простого примера. Пасибо.
Yandex
Объявления
19.11.2012, 20:13     Обработка параметров командной строки. Можно ли ещё проще?
Ответ Создать тему
Опции темы

Текущее время: 07:45. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru