![]() |
|
Модераторы: bsa |
![]()
|
|
| HeyThere |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 9 Регистрация: 1.3.2013 Репутация: нет Всего: нет |
Есть строка типа "тест1,тест34,,фыв", требуется разбить ее на массив с элементами "тест1", "тест34", "", "фыв". Как организовать? Может есть у кого готовые алгоритмы...
|
|||
|
||||
| NoviceF |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 313 Регистрация: 13.3.2012 Где: Ростов-на-Дону Репутация: 2 Всего: 2 |
Есть вот такая заготовка:
Это сообщение отредактировал(а) NoviceF - 3.3.2013, 19:50 |
|||
|
||||
| fish9370 |
|
||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 663 Регистрация: 15.4.2007 Где: Москва Репутация: 1 Всего: 1 |
функция на Си подойдет?
внимание: первоначальная строка будет уничтожена (нужно копировать)
использование:
Это сообщение отредактировал(а) fish9370 - 3.3.2013, 19:51 -------------------- undefined |
||||
|
|||||
| bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 85 Всего: 196 |
NoviceF, через std::getline будет проще
fish9370, а разве не для этого strtok существует |
|||
|
||||
| fish9370 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 663 Регистрация: 15.4.2007 Где: Москва Репутация: 1 Всего: 1 |
Эта функция немного другая,
более похожа на мою, я только не могу понять, размерность ptrptr, если токенов окажется больше чем я выделю под ptrptr? -------------------- undefined |
|||
|
||||
| xvr |
|
||||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 35 Всего: 223 |
У prtprt размерности нет - это указатель на переменную типа char*
Так что это не та функция. И вообще strtok с сотоварищами ТС не подойдет - она трактует повторяющиеся разделители как один, а ТС нужно отработать каждый по отдельности |
||||
|
|||||
| fish9370 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 663 Регистрация: 15.4.2007 Где: Москва Репутация: 1 Всего: 1 |
да нет судя по объявлению, это указатель на *char (короче char **ptrptr), значит должна быть размерность.. я не помню, почему я не стал пользоваться этой функцией.. -------------------- undefined |
|||
|
||||
| bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 85 Всего: 196 |
fish9370, что значит размерность? sizeof(char*) - вот такая размерность. Ей нужно лишь указатель на переменную, в которой она будет хранить текущую позицию в строке.
|
|||
|
||||
| fish9370 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 663 Регистрация: 15.4.2007 Где: Москва Репутация: 1 Всего: 1 |
мне вопрос на самом деле не совсем понятен, char** - массив указателей, у массива есть размерность.. или мы друг друга не понимаем? -------------------- undefined |
|||
|
||||
| xvr |
|
||||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 35 Всего: 223 |
Видимо не только у Буратино проблемы с количеством звездочек char** - это совсем не обязательно массив указателей. В данном случае это указатель на одну скалярную переменную.
|
||||
|
|||||
| fish9370 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 663 Регистрация: 15.4.2007 Где: Москва Репутация: 1 Всего: 1 |
да, с примером, все стало на свои места, на мой взгляд, это неудобно.. требуются дополнительные операции по извлечению строки.. в частности мы не можем сразу извлечь n-ю строку, иногда только она и нужна..
-------------------- undefined |
|||
|
||||
| xvr |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 35 Всего: 223 |
Ну в общем да - неудобно. И шурупы молотком забивать неудобно Эта функция была сделанна как замена strtok, которая в свою очередь появилась еще в K&R времена, и была предназначенна исключительно для последовательного разбиения строки на части. Для функции, которая могла бы выдать сразу все разбиение в виде массива, понадобилось бы где то создать массив, причем заранее неизвестного размера. Так что по частям оно гораздо проще (да и гибче - например параметр delim может от вызова к вызову меняться |
|||
|
||||
| fish9370 |
|
||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 663 Регистрация: 15.4.2007 Где: Москва Репутация: 1 Всего: 1 |
не соглашусь - мало того это ненужная работа, к примеру, на входе мы получаем от некоторого устройства вот такую форматную строку (строку с четко заданным форматом):
очевидно, что если данная строка не состоит из 16 значений, она ошибочна, Вашим способом, чтобы выявить ошибку придется вести полный разбор.. и потом, допустим я хочу получить значение номера Б, я просто обращаюсь к позиции номер 9 и все, я не анализирую ненужные мне позиции.. это пример из жизни, ничего не придумано.. назовите хоть одно приемущество strtok_r
а зачем? -------------------- undefined |
||||
|
|||||
| bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 85 Всего: 196 |
она уже есть и писать ее не надо.
А потом, чтобы распарсить всю эту строку, тебе необходимо по ней пробежаться в любом случае. strtok позволяет это сделать:
|
|||
|
||||
| fish9370 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 663 Регистрация: 15.4.2007 Где: Москва Репутация: 1 Всего: 1 |
это я не понял
хочу заметить, ты загоняешь все строки в массив, т.е. делаешь то же самое.. только извне.. это не преимущество.. плюс выполняешь дополнительное копирование.. и копирование не совсем чистое, может быть переполнение буфера.. т.е. в конечном варианте, все может еще немного измениться в коде.. Это сообщение отредактировал(а) fish9370 - 4.3.2013, 17:52 -------------------- undefined |
|||
|
||||
![]()
|
| Правила форума "C/C++: Для новичков" | |
|
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Для новичков | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |