| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Общие вопросы > Вырезать из строки целые и вещественные числа |
| Автор: Vokunya 23.3.2010, 22:24 | ||
| Поиск дает много чего по такого рода примерам: из, например, "hfuh7jho87jan23" вытащить все числа. Здесь все понятно. Я стопорюсь с такой задачей: Дана строка, содержащая слова, целые и вещественные числа. Переставить элементы строки так, чтобы сначала располагались целые числа, потом слова, а потом вещественные числа Т.е., например: из "16.2 jdfjfsff 45 76jhsk 74.2" получить "45 jdfjfsff 76jhsk 16.2 74.2" Мои умозаключения сводились к следующему: 1. Разбиваем строку при помощи strtok; 2. Как-то надо узнать что мы получили: целое или вещественное число, или просто слово... я придумал только такое, на мой взгляд, извращение:
т.е конвертнули слово в int, затем обратная операция, сравнили длину исходного слова и получившегося после конвертирования, если длины равны - то целое число )) затем аналогичные действия для float, а то что осталось - просто слова Вопрос: есть другие решения или мой вариант вполне жизнеспособен? |
| Автор: djamshud 23.3.2010, 23:35 |
| Самое верное на мой взгляд решение - написать элементарнейший парсер из десяти строк: разбить строку на поток лексем "слово", "целое", "дробное"" и потом расставить их в нужном порядке. |
| Автор: GoldFinch 23.3.2010, 23:56 |
| используйте регулярные выражения. |
| Автор: Vokunya 24.3.2010, 00:02 | ||||
я же и интересуюсь реализацией этой задачи
хм... даже не задумывался над этим |
| Автор: GoldFinch 24.3.2010, 09:09 |
| хотя регулярки это пожалуй сложновато для такой задачи, проще перебирать символы в слове и проверять их на "0"-"9" для целых и "." для вещественных |
| Автор: Vokunya 24.3.2010, 09:40 | ||||
вероятно да
но регулярки теперь уже интересны для саморазвития эээ... я плохо смотрел или в стандарте С99 нет библиотеки для регэкспов? |
| Автор: Earnest 24.3.2010, 09:47 |
| Я бы использовала функцию strtod (хотя не уверена, что она стандартная, но вроде да). Фокус в том, что она возвращает кроме смого числа указатель на место в строке, где ее парсинг закончился (т.е. где число закончилось). Оттуда и нужно начинать следующий парсинг. Можно вообще не париться с анализом - вернула указатель туда же откуда начала - стало быть не число. Но можно сначала сканировать и искать первый символ, который может быть числом. Самому написать, конечно, можно, но коррекстно распарсить все варианты double - упаришься - все это E-04 и т.д. |
| Автор: xvr 24.3.2010, 10:03 | ||
+1 Добавлю к рекомендации - использовать ее вместе с strtol. Если strtod отработала успешно, на это же слово запускается strtol. Если она вернет тот же поинтер в качестве конца парсинга, то число целое, иначе вещественное |
| Автор: GoldFinch 24.3.2010, 11:05 |
| вместо С99 проще использовать язык более подходящий для задач связанных с обработкой текста %) |
| Автор: Earnest 24.3.2010, 12:20 |
| xvr, точно, чтобы совсем самому не напрягаться |
| Автор: azesmcar 24.3.2010, 12:49 | ||
дай угадаю.. питон? |
| Автор: GoldFinch 24.3.2010, 13:11 |
| azesmcar, не обязательно. я бы сделал макрос для ворда или notepad++ |
| Автор: Vokunya 24.3.2010, 13:27 | ||
это же задание контрольной работы - только С99 Earnest, xvr сейчас на скорую руку набросал код с использованием strtod и strtol... вроде парсит сейчас нет времени, но сегодня вечером/завтра отпишусь о результатах |
| Автор: Vokunya 24.3.2010, 20:20 | ||
Итак, в результате наваял вот это:
Наверняка что-нибудь можно подправить, буду благодарен за предложения! |
| Автор: Dov 26.3.2010, 13:11 | ||
Вот такое предложение:
|
| Автор: Vokunya 26.3.2010, 13:44 |
| Вот и дождался еще одного варианта Благодарю всех за обсуждение - вопрос решен. Отдельное спасибо Earnest, xvr и Dov |
| Автор: xvr 26.3.2010, 15:40 | ||
Неа - 123e-5 не будет распознанно как double |
| Автор: Dov 26.3.2010, 16:02 |
Не вижу никаких трудностей для человека... с интеллектом прикрутить эту фичу к коду. А ты видишь, xvr? |
| Автор: Earnest 26.3.2010, 18:14 |
| ... Человек с интеллектом должен искать способ сделать все наиболее простым способом... |