![]() |
Модераторы: Daevaorn |
![]() ![]() ![]() |
|
Vokunya |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 73 Регистрация: 7.12.2008 Где: Беларусь Репутация: нет Всего: 1 |
Поиск дает много чего по такого рода примерам: из, например, "hfuh7jho87jan23" вытащить все числа. Здесь все понятно.
Я стопорюсь с такой задачей: Дана строка, содержащая слова, целые и вещественные числа. Переставить элементы строки так, чтобы сначала располагались целые числа, потом слова, а потом вещественные числа Т.е., например: из "16.2 jdfjfsff 45 76jhsk 74.2" получить "45 jdfjfsff 76jhsk 16.2 74.2" Мои умозаключения сводились к следующему: 1. Разбиваем строку при помощи strtok; 2. Как-то надо узнать что мы получили: целое или вещественное число, или просто слово... я придумал только такое, на мой взгляд, извращение: ![]()
т.е конвертнули слово в int, затем обратная операция, сравнили длину исходного слова и получившегося после конвертирования, если длины равны - то целое число )) затем аналогичные действия для float, а то что осталось - просто слова Вопрос: есть другие решения или мой вариант вполне жизнеспособен? ![]() |
|||
|
||||
djamshud |
|
|||
![]() Пердупержденный ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1655 Регистрация: 23.11.2009 Репутация: 8 Всего: 39 |
Самое верное на мой взгляд решение - написать элементарнейший парсер из десяти строк: разбить строку на поток лексем "слово", "целое", "дробное"" и потом расставить их в нужном порядке.
-------------------- 'Cuz I never walk away from what I know is right Alice Cooper - Freedom |
|||
|
||||
GoldFinch |
|
|||
![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2141 Регистрация: 30.11.2008 Репутация: 15 Всего: 26 |
используйте регулярные выражения.
|
|||
|
||||
Vokunya |
|
||||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 73 Регистрация: 7.12.2008 Где: Беларусь Репутация: нет Всего: 1 |
я же и интересуюсь реализацией этой задачи ![]()
хм... даже не задумывался над этим ![]() Это сообщение отредактировал(а) Vokunya - 24.3.2010, 00:06 |
||||
|
|||||
GoldFinch |
|
|||
![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2141 Регистрация: 30.11.2008 Репутация: 15 Всего: 26 |
хотя регулярки это пожалуй сложновато для такой задачи,
проще перебирать символы в слове и проверять их на "0"-"9" для целых и "." для вещественных |
|||
|
||||
Vokunya |
|
||||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 73 Регистрация: 7.12.2008 Где: Беларусь Репутация: нет Всего: 1 |
вероятно да
но регулярки теперь уже интересны для саморазвития ![]() эээ... я плохо смотрел или в стандарте С99 нет библиотеки для регэкспов? Это сообщение отредактировал(а) Vokunya - 24.3.2010, 09:47 |
||||
|
|||||
Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 53 Всего: 183 |
Я бы использовала функцию strtod (хотя не уверена, что она стандартная, но вроде да). Фокус в том, что она возвращает кроме смого числа указатель на место в строке, где ее парсинг закончился (т.е. где число закончилось). Оттуда и нужно начинать следующий парсинг. Можно вообще не париться с анализом - вернула указатель туда же откуда начала - стало быть не число. Но можно сначала сканировать и искать первый символ, который может быть числом. Самому написать, конечно, можно, но коррекстно распарсить все варианты double - упаришься - все это E-04 и т.д.
-------------------- ... |
|||
|
||||
xvr |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 60 Всего: 223 |
+1 Добавлю к рекомендации - использовать ее вместе с strtol. Если strtod отработала успешно, на это же слово запускается strtol. Если она вернет тот же поинтер в качестве конца парсинга, то число целое, иначе вещественное |
|||
|
||||
GoldFinch |
|
|||
![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2141 Регистрация: 30.11.2008 Репутация: 15 Всего: 26 |
вместо С99 проще использовать язык более подходящий для задач связанных с обработкой текста %)
|
|||
|
||||
Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 53 Всего: 183 |
xvr, точно, чтобы совсем самому не напрягаться
![]() -------------------- ... |
|||
|
||||
azesmcar |
|
|||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 81 Всего: 211 |
||||
|
||||
GoldFinch |
|
|||
![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2141 Регистрация: 30.11.2008 Репутация: 15 Всего: 26 |
azesmcar, не обязательно.
я бы сделал макрос для ворда или notepad++ |
|||
|
||||
Vokunya |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 73 Регистрация: 7.12.2008 Где: Беларусь Репутация: нет Всего: 1 |
это же задание контрольной работы - только С99 ![]() Earnest, xvr сейчас на скорую руку набросал код с использованием strtod и strtol... вроде парсит ![]() сейчас нет времени, но сегодня вечером/завтра отпишусь о результатах |
|||
|
||||
Vokunya |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 73 Регистрация: 7.12.2008 Где: Беларусь Репутация: нет Всего: 1 |
Итак, в результате наваял вот это:
Наверняка что-нибудь можно подправить, буду благодарен за предложения! |
|||
|
||||
Dov |
|
|||
![]() аСинизатор ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1721 Регистрация: 10.5.2003 Где: Эрец-Исраэль Репутация: 15 Всего: 88 |
Вот такое предложение:
Это сообщение отредактировал(а) Dov - 26.3.2010, 13:55 -------------------- Тут вечности запах томительный, И свежие фрукты дешевые, А климат у нас – изумительный, И только соседи – #уевые. Игорь Губерман. |
|||
|
||||
![]() ![]() ![]() |
Правила форума "С++:Общие вопросы" | |
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |