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

Не парсит аргументы - C++

Восстановить пароль Регистрация
 
mak326428
36 / 36 / 3
Регистрация: 04.02.2011
Сообщений: 199
29.08.2011, 12:08     Не парсит аргументы #1
Написал на досуге небольшую программку. Что обидно, вроде всё нормально, но проблеммы с парсингом аргументов командной строки. Весь код:
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
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
// generator.cpp
#include "stdafx.h"
#include <iostream>
#include <string>
#include <cstdlib>
using namespace std;
string combinates = "";
// Инициализация букв и цифр для генерирования
void __initCombinates(bool letters, bool signs, bool upperLetters)
{
    if (letters)
        combinates += "qwertyuiopasdfghjklzxcvbnm";
    if (signs)
        combinates += "0123456789";
    if (upperLetters)
        combinates += "QWERTYUIOPASDFGHJKLZXCVBNM";
}
// Генерируем случайное число
int genRnd(int min, int max)
{
    return rand() % max + min;
}
// Генерируем сам пароль
string genPass(int minlength, int maxlength)
{
    string res = "";
    int length = genRnd(minlength, maxlength);
    for (int i = 0; i < length; ++i)
    {
        res += combinates[genRnd(0, combinates.length())];
    }
    return res;
}
// main(). Парсим аргументы, проверяем, выводим сгенерированное
int _tmain(int argc, _TCHAR* argv[])
{
    bool letters = false, upperLetters = false, signs = false;
    int howmany, minlength, maxlength;
    bool usedHowmany = false, usedMinlength = false, usedMaxlength = false;
    // Вот тут проблеммы
    for (int a = 0; a < argc; ++a)
    {
        if (argv[a] == L"-useLetters")
            letters = true;
        if (argv[a] == L"-useSigns")
            signs = true;
        if (argv[a] == L"-useUpperLetters")
            upperLetters = true;
        if (argv[a] == L"-howmany")
        {
            usedHowmany = true;
            howmany = (int)argv[a + 1];
        }
        if (argv[a] == L"-minlength")
        {
            usedMinlength = true;
            minlength = (int)argv[a + 1];
        }
        if (argv[a] == L"-maxlength")
        {
            usedMaxlength = true;
            maxlength = (int)argv[a + 1];
        }
    }
    if ((!letters && !signs && !upperLetters) || !usedHowmany || !usedMinlength || !usedMaxlength)
    {
        cout << "Usage: generator [-useLetters] [-useSigns] [-useUpperLetters] -howmany <length> -minlength <minlength> -maxlength <maxlength>" << endl;
        return 1;
    }
    __initCombinates(letters, signs, upperLetters);
    for (int i = 0; i < howmany; ++i)
    {
        cout << genPass(minlength, maxlength) << endl;
    }
    return 0;
}
Добавлено через 2 минуты
P.S. запускал с аргументами: generator -useSigns -useLetters -howmany 12 -minlength 5 -maxlength 12
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
-=ЮрА=-
Заблокирован
Автор FAQ
29.08.2011, 12:28     Не парсит аргументы #2
Цитата Сообщение от mak326428 Посмотреть сообщение
-howmany 12
Цитата Сообщение от mak326428 Посмотреть сообщение
-minlength 5
Цитата Сообщение от mak326428 Посмотреть сообщение
-maxlength 12
Думаю что эти аргументы будут идти не как одна строка -string (char *)num, а будт разбиты на два отдельных строковых параметра -string и (char *)num
mak326428
36 / 36 / 3
Регистрация: 04.02.2011
Сообщений: 199
29.08.2011, 12:35  [ТС]     Не парсит аргументы #3
-=ЮрА=-, можно пример кода?
grizlik78
Эксперт С++
 Аватар для grizlik78
1882 / 1414 / 101
Регистрация: 29.05.2011
Сообщений: 2,960
29.08.2011, 13:14     Не парсит аргументы #4
Так строки не сравнивают.
C++
1
if (argv[a] == L"-useLetters")
Здесь сравнивается не содержимое строк, а указатели, которые наверняка не равны.
Строки можно сравнивать с помощью strcmp (в подходящем варианте)
C++
1
if (0 == _tcscmp(argv[a], _T("-useLetters")))
-=ЮрА=-
Заблокирован
Автор FAQ
29.08.2011, 13:22     Не парсит аргументы #5
Цитата Сообщение от mak326428 Посмотреть сообщение
-=ЮрА=-, можно пример кода?
я тут посмотрел - ты почти верно сам сделал,(я теперь увидел что и параметры дополнительно рассматриваешь - о чём раньше написал только ты делаёшь (int)char * str, а нужно atoi((int)char * str) ) преобразовывать строку в число нужно не (int) а atoi(),
C++
1
2
3
4
5
6
if (argv[a] == L"-howmany")
                {
                        usedHowmany = true;
                        howmany = atoi(argv[a + 1]);
                                 
                }
думаю в твоём прежнем коде преобразовывался толкьо первый символ строки и если допусим вводил 12, то преобразование шло по алгоритму (int)'1', что равно (int)'0' + 1 = 49 на сколько я помню кодировку символов
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
29.08.2011, 13:23     Не парсит аргументы #6
Как-то так. Только не компилируется. desc не видит...

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
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
#include <boost/program_options/parsers.hpp>
#include <boost/program_options/options_description.hpp>
#include <boost/program_options.hpp>
#include <iostream>
#include <cstdlib>
 
namespace params
{
     int howmany = -1;
     int min_length = -1;
     int max_length = -1;
}
 
namespace po = boost::program_options;
 
namespace
{
 
po::options_description desc("Allowed");
desc.add_options()
     ("help,h", "help message")
     ("useLetters,useLetters", "Allow use letters")
     ("useSigns,useSigns", "Allow use signs")
     ("useUpperLetters,useUpperLetters", "Allow use upper letters")
     ("howmany,howmany", po::value<int>(&params::howmany), "how many attempts")
     ("minlength,minlength", po::value<int>(&params::min_length), "min length of password")
     ("maxlength,maxlength", po::value<int>(&params::max_length), "max length of password")
;
 
}
 
std::string combinates = "";
// Инициализация букв и цифр для генерирования
void __initCombinates(bool letters, bool signs, bool upperLetters)
{
        if (letters)
                combinates += "qwertyuiopasdfghjklzxcvbnm";
        if (signs)
                combinates += "0123456789";
        if (upperLetters)
                combinates += "QWERTYUIOPASDFGHJKLZXCVBNM";
}
// Генерируем случайное число
int genRnd(int min, int max)
{
        return rand() % max + min;
}
// Генерируем сам пароль
std::string genPass(int minlength, int maxlength)
{
        std::string res = "";
        int length = genRnd(minlength, maxlength);
        for (int i = 0; i < length; ++i)
        {
                res += combinates[genRnd(0, combinates.length())];
        }
        return res;
}
 
int main(int argc, char* argv[])
{
    srand(time(NULL));
    po::variables_map var_map;
    try
    {
        po::store(po::command_line_parser(argc, argv).options(desc).run(), var_map);
        po::notify(var_map);
    }
    catch (const std::exception& e)
    {
         std::cerr << desc << std::endl;
         std::cerr << "Error: " << e.what() << std::endl;
         return 1;
    }
    bool allowLet = false, allowSig = false, allowUpLet = false;
    if (var_map.count("help"))
    {
        std::cerr << desc << std::endl;
        return 0;
    }
    if (var_map.count("useLetters"))
    {
        allowLet = true;
    }
    if (var_map.count("useSigns"))
    {
        allowSig = true;
    }
    if (var_map.count("useUpperLetters"))
    {
        allowUpLet = true;
    }
    if ((!allowLet && !allowSig && !allowUpLet) || params::howmany == -1 || params::min_length == -1 || params::max_length == -1)
    {
        std::cerr << desc << std::endl;
        return 1;
    }
    __initCombinates(allowLet, allowSig, allowUpLet);
    for (int i = 0; i < params::howmany; ++i)
    {
        std::cout << genPass(params::min_length, params::max_length) << std::endl;
    }
}
mak326428
36 / 36 / 3
Регистрация: 04.02.2011
Сообщений: 199
29.08.2011, 13:56  [ТС]     Не парсит аргументы #7
ForEveR, у меня нету boost'а
Интересно, что я сейчас не так делаю?
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
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
// generator.cpp
#include "stdafx.h"
#include <iostream>
#include <string>
#include <cstdlib>
using namespace std;
string combinates = "";
// Инициализация букв и цифр для генерирования
void __initCombinates(bool letters, bool signs, bool upperLetters)
{
        if (letters)
                combinates += "qwertyuiopasdfghjklzxcvbnm";
        if (signs)
                combinates += "0123456789";
        if (upperLetters)
                combinates += "QWERTYUIOPASDFGHJKLZXCVBNM";
}
// Генерируем случайное число
int genRnd(int min, int max)
{
        return rand() % max + min;
}
// Генерируем сам пароль
string genPass(int minlength, int maxlength)
{
        string res = "";
        int length = genRnd(minlength, maxlength);
        for (int i = 0; i < length; ++i)
        {
                res += combinates[genRnd(0, combinates.length())];
        }
        return res;
}
// main(). Парсим аргументы, проверяем, выводим сгенерированное
int _tmain(int argc, _TCHAR* argv[])
{
        bool letters = false, upperLetters = false, signs = false;
        int howmany, minlength, maxlength;
        bool usedHowmany = false, usedMinlength = false, usedMaxlength = false;
        // Вот тут проблеммы
        for (int a = 0; a < argc; ++a)
        {
                if (0 == _tcscmp(argv[a], _T("-useLetters")))
                        letters = true;
                if (0 == _tcscmp(argv[a], _T("-useSigns")))
                        signs = true;
                if (0 == _tcscmp(argv[a], _T("-useUpperLetters")))
                        upperLetters = true;
                if (0 == _tcscmp(argv[a], _T("-howmany")))
                {
                        usedHowmany = true;
                        howmany = atoi((char*)argv[a + 1]);
                }
                if (0 == _tcscmp(argv[a], _T("-minlength")))
                {
                        usedMinlength = true;
                        minlength = atoi((char*)argv[a + 1]);
                }
                if (0 == _tcscmp(argv[a], _T("-maxlength")))
                {
                        usedMaxlength = true;
                        maxlength = atoi((char*)argv[a + 1]);
                }
        }
        if ((!letters && !signs && !upperLetters) || !usedHowmany || !usedMinlength || !usedMaxlength)
        {
                cout << "Usage: generator [-useLetters] [-useSigns] [-useUpperLetters] -howmany <length> -minlength <minlength> -maxlength <maxlength>" << endl;
                return 1;
        }
        __initCombinates(letters, signs, upperLetters);
        for (int i = 0; i < howmany; ++i)
        {
                cout << genPass(minlength, maxlength) << endl;
        }
        return 0;
}
grizlik78
Эксперт С++
 Аватар для grizlik78
1882 / 1414 / 101
Регистрация: 29.05.2011
Сообщений: 2,960
29.08.2011, 14:00     Не парсит аргументы #8
Цитата Сообщение от mak326428 Посмотреть сообщение
Интересно, что я сейчас не так делаю?
Подозреваю, что используется-таки "широкая" версия строки.
Для "универсальности" вместо
C++
1
minlength = atoi((char*)argv[a + 1]);
стоит записывать так:
C++
1
minlength = _tstoi(argv[a + 1]);
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
29.08.2011, 14:04     Не парсит аргументы
Еще ссылки по теме:

Не передаются аргументы C++
C++ Аргументы Функции
C++ Консольное приложение, которое парсит HTML страничку

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

Или воспользуйтесь поиском по форуму:
mak326428
36 / 36 / 3
Регистрация: 04.02.2011
Сообщений: 199
29.08.2011, 14:04  [ТС]     Не парсит аргументы #9
grizlik78, Спасибо. Теперь заработала.
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
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
// generator.cpp
#include "stdafx.h"
#include <iostream>
#include <string>
#include <cstdlib>
using namespace std;
string combinates = "";
// Инициализация букв и цифр для генерирования
void __initCombinates(bool letters, bool signs, bool upperLetters)
{
        if (letters)
                combinates += "qwertyuiopasdfghjklzxcvbnm";
        if (signs)
                combinates += "0123456789";
        if (upperLetters)
                combinates += "QWERTYUIOPASDFGHJKLZXCVBNM";
}
// Генерируем случайное число
int genRnd(int min, int max)
{
        return rand() % max + min;
}
// Генерируем сам пароль
string genPass(int minlength, int maxlength)
{
        string res = "";
        int length = genRnd(minlength, maxlength);
        for (int i = 0; i < length; ++i)
        {
                res += combinates[genRnd(0, combinates.length())];
        }
        return res;
}
// main(). Парсим аргументы, проверяем, выводим сгенерированное
int _tmain(int argc, _TCHAR* argv[])
{
        bool letters = false, upperLetters = false, signs = false;
        int howmany, minlength, maxlength;
        bool usedHowmany = false, usedMinlength = false, usedMaxlength = false;
        // Вот тут проблеммы
        for (int a = 0; a < argc; ++a)
        {
                if (0 == _tcscmp(argv[a], _T("-useLetters")))
                        letters = true;
                if (0 == _tcscmp(argv[a], _T("-useSigns")))
                        signs = true;
                if (0 == _tcscmp(argv[a], _T("-useUpperLetters")))
                        upperLetters = true;
                if (0 == _tcscmp(argv[a], _T("-howmany")))
                {
                        usedHowmany = true;
                        howmany = _tstoi(argv[a + 1]);
                }
                if (0 == _tcscmp(argv[a], _T("-minlength")))
                {
                        usedMinlength = true;
                        minlength = _tstoi(argv[a + 1]);
                }
                if (0 == _tcscmp(argv[a], _T("-maxlength")))
                {
                        usedMaxlength = true;
                        maxlength = _tstoi(argv[a + 1]);
                }
        }
        if ((!letters && !signs && !upperLetters) || !usedHowmany || !usedMinlength || !usedMaxlength)
        {
                cout << "Usage: generator [-useLetters] [-useSigns] [-useUpperLetters] -howmany <length> -minlength <minlength> -maxlength <maxlength>" << endl;
                return 1;
        }
        __initCombinates(letters, signs, upperLetters);
        for (int i = 0; i < howmany; ++i)
        {
                cout << genPass(minlength, maxlength) << endl;
        }
        return 0;
}
Yandex
Объявления
29.08.2011, 14:04     Не парсит аргументы
Ответ Создать тему
Опции темы

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