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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Excogit8er
2 / 2 / 0
Регистрация: 23.10.2012
Сообщений: 66
#1

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

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

Обработка параметров командной строки - C++
Решение должно представлять собой самостоятельное приложение командной строки, входной файл для которого задается ключом -i &lt;имя файла&gt;,...

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

Чтение параметров из командной строки - C++
есть програма которая считает количество строк. написана на с. через командную строку я её скомпилировал - она работает! подскажите плз...

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

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

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

Обработка параметров коммандной строки - C++
как обработать несколько параметров для опции? getopt вроде только один берет. Вот что хочу: move_user --user user_name --nodes node44...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
soon
2540 / 1305 / 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.
564 / 547 / 5
Регистрация: 16.12.2011
Сообщений: 1,389
19.11.2012, 18:31     Обработка параметров командной строки. Можно ли ещё проще? #4
Excogit8er, можете std::string использовать. Всяко удобнее, чем char[]
Кроме того, даже у чаров есть спец функции для сравнения строк
XRuZzz
Антикодер
659 / 560 / 27
Регистрация: 15.09.2012
Сообщений: 2,511
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
4008 / 2297 / 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
4008 / 2297 / 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     Обработка параметров командной строки. Можно ли ещё проще?
Еще ссылки по теме:

можно написать ее как то проще ? - C++
#include &lt;stdio.h&gt; #include &lt;locale.h&gt; #include &lt;string&gt; #include &lt;conio.h&gt; int main() { setlocale(LC_CTYPE, &quot;rus&quot;); ...

Числа Каталана,можно ли проще? - C++
Задание :Числа Каталана Cn, которые играют большую роль в комбинаторике (например, Cn равно числу полных бинарных деревьев с n+1 листьями),...

нужно решить как можно проще - C++
в текстовом файле подсчитать количество строк, которые начинаются и оканчиваются одной и той же буквой

Можно ли это написать как то проще - C++
#include &lt;cstdlib&gt; #include &lt;iostream&gt; #include &lt;stdlib.h&gt; #include &lt;math.h&gt; using namespace std; /* В одномерном...

Сочините пример как можно проще на сдвиг - C++
Сочините пример как можно проще на сдвиг. Сам пользоваться умею, не могу только придумать новичковую задачу на эти операторы и как их...


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

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

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

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