Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Переделать строку в argv, Как? 
:(
    Опции темы
Goganchic
Дата 2.11.2007, 19:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 678
Регистрация: 18.6.2004

Репутация: нет
Всего: 5



Всем привет!
Как си-программисты знают, при запуске программы ей передается массив аргументов, обычно в переменной argv, которая представляет собой двумерный массив. У меня возникала проблема: надо из обычной строки руками или какой-нибудь особой функцией получить массив аргументов, как будто бы они заданы в командной строке.
Первое, оно же ошибочное, решение - разбить строку по символу пробел. Ошибочное потому что не учитывает:
  • заэкранированных пробелов ./test a\ b - передается один аргумент "a b"
  • не учитывает ковычек ./test "a b" передается один аргумент "a b"
Теперь думаю, может быть можно как-то разбить строку на массив с помощью регулярного выражения? Подскажите кто что думает по этому поводу. Заранее благодарен.
PM Jabber   Вверх
JackYF
Дата 2.11.2007, 21:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

Репутация: 18
Всего: 162



Goganchic, может быть, тебе помогут исходники ld(unix)? Ведь он этим занимается, по идее - заполнением argc/argv (поправьте меня, если неправ).


--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
MAKCim
Дата 2.11.2007, 22:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 52
Всего: 207



JackYF, 
посмотри на семейство функций exec*
т. е в ядро уже передаются указатели на строки, которые представляют аргументы
парсингом занимается командный интерпретатор


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
Goganchic
Дата 3.11.2007, 12:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 678
Регистрация: 18.6.2004

Репутация: нет
Всего: 5



Придется смотреть сырки shell-а...
PM Jabber   Вверх
Goganchic
Дата 3.11.2007, 14:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 678
Регистрация: 18.6.2004

Репутация: нет
Всего: 5



Написал тут на досуге простенькие фукнции, посмотрите плз., сразу же скажу: эти функции очень сырые. Если кто предложит методы усовершенствования - будут оч. благодарен:
Код

/**
 * Return number of arguments in args
 * @param args string as argv array
 * @return number of arguments
 */
int str_opts_num(char* args)
{
    int res = 0;
    int pos = 0;
    int q = 0;

    if (strlen(args) > 0)
    {
        res = 1;
    }

    while (args[pos] != 0)
    {
        if (args[pos] == ' ' && q == 0 && args[pos - 1] != '\\')
        {
            res += 1;
        }

        if (args[pos] == '"' && args[pos - 1] != '\\')
        {
            if (q == 0)
            {
                q = 1;
            }
            else
            {
                if (q == 1)
                {
                    q = 0;
                }
            }
        }

        if (args[pos] == '\'' && args[pos - 1] != '\\')
        {
            if (q == 0)
            {
                q = 2;
            }
            else
            {
                if (q == 2)
                {
                    q = 0;
                }
            }
        }

        pos++;
    }

    return res;
}

/**
 * Transform string to argv array
 * @param args target string
 * @return argv array (should be deleted manually)
 */
char** str2argv(char* args)
{
    char** res = malloc(sizeof(char*) * str_opts_num(args));
    int pos = 0;
    int q = 0;
    int cur_num = 0;
    int str_pos = 0;

    if (strlen(args) > 0)
    {
        res[0] = malloc(sizeof(char) * 100);
    }

    while (args[pos] != 0)
    {
        if (args[pos] == ' ' && q == 0 && args[pos - 1] != '\\')
        {
            res[cur_num][str_pos] = 0;
            pos++;
            cur_num += 1;
            str_pos = 0;
            res[cur_num] = malloc(sizeof(char) * 100);
            continue;
        }

        if (args[pos] == '"' && args[pos - 1] != '\\')
        {
            if (q == 0)
            {
                q = 1;
            }
            else
            {
                if (q == 1)
                {
                    q = 0;
                }
            }
        }

        if (args[pos] == '\'' && args[pos - 1] != '\\')
        {
            if (q == 0)
            {
                q = 2;
            }
            else
            {
                if (q == 2)
                {
                    q = 0;
                }
            }
        }

        if (!(args[pos] == '\\'))
        {
            res[cur_num][str_pos] = args[pos];
            str_pos++;
        }

        pos++;
    }

    res[cur_num][str_pos] = 0;

    return res;
}



Скажу сразу же: эти функции обязательно должны быть написаны на си (не си++) и обязаны быть кроссплаформенными (без вских там Win API, в то же время использование линуховых фишек - не возбраняется).
З.ы. память выделенную функцией str2argv нужно очищать руками.
PM Jabber   Вверх
MAKCim
Дата 3.11.2007, 14:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 52
Всего: 207



Goganchic, 
конечный автомат тут нужен


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
Goganchic
Дата 3.11.2007, 16:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 678
Регистрация: 18.6.2004

Репутация: нет
Всего: 5



MAKCim, ну это-то понятно. Только случай у нас не общий а частный, поэтому как-то не особо хочется припетать всю теорию конечных автоматов smile
PM Jabber   Вверх
MAKCim
Дата 3.11.2007, 16:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 52
Всего: 207



Goganchic, 
а тут вся теория и не нужна
нужен набор состояний и переходы между ними
реализуется через матрицу указателей на функции
только в этом случае можно будет учесть все возможные варианты строки


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0559 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.