Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

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

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

19.11.2012, 18:03. Просмотров 771. Ответов 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
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Обработка параметров командной строки. Можно ли ещё проще? (C++):

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

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

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

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

Передача параметров командной строки в main(): что происходит в коде? - C++
Здравствуйте. Объясните пожалуйста, что идет в main ? ... printf(&quot;IMAGE NAME: %s\n&quot;, filename); ... void A(int h) { //это...

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

9
soon
2542 / 1307 / 81
Регистрация: 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 / 0
Регистрация: 23.10.2012
Сообщений: 66
Завершенные тесты: 1
19.11.2012, 18:29  [ТС] #3
Ага, спасибо. Правда, не уверен, что для такой простенькой задачи, как моя, нужны какие-то парсеры и т.д.
Имя ключа известно, сравнил введенную строку с той, что должна быть - и достаточно.
0
I.M.
565 / 548 / 5
Регистрация: 16.12.2011
Сообщений: 1,389
19.11.2012, 18:31 #4
Excogit8er, можете std::string использовать. Всяко удобнее, чем char[]
Кроме того, даже у чаров есть спец функции для сравнения строк
0
XRuZzz
Антикодер
687 / 593 / 29
Регистрация: 15.09.2012
Сообщений: 2,541
19.11.2012, 18:32 #5
обычно регулярными выражениями строки обрабатываются. хотя ответ soon-a мне больше нравится(скорее всего boost использует свои средства с регулярными выражениями, для обработки опций)
0
Excogit8er
2 / 2 / 0
Регистрация: 23.10.2012
Сообщений: 66
Завершенные тесты: 1
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
4009 / 2298 / 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;
    }
1
Excogit8er
2 / 2 / 0
Регистрация: 23.10.2012
Сообщений: 66
Завершенные тесты: 1
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
4009 / 2298 / 155
Регистрация: 03.02.2011
Сообщений: 5,064
Записей в блоге: 10
19.11.2012, 19:58 #9
Цитата Сообщение от Excogit8er Посмотреть сообщение
Если не соответствует - все равно в true? ))
Нет, конечно. Читаем про тернарный оператор.
1
Excogit8er
2 / 2 / 0
Регистрация: 23.10.2012
Сообщений: 66
Завершенные тесты: 1
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
Привет! Вот еще темы с ответами:

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

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

можно написать ее как то проще ? - 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 листьями),...


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

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

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