Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 18.06.2009, 14:20   #1
Molotoff
Пользователь
 
Регистрация: 01.04.2009
Сообщений: 20
По умолчанию Как лучше распарсить строку?

Вообщем ситуация следующая - есть некоторый файл с данными, построчно считывается в массив char, т.е. каждая строка файла представляется массивом символов.
Есть, например, строка - "Num. of variables = 63;". Задача вот это самое значение 63 записать в int`овую переменную. Все способы, которые у меня лезут в голову какие-то кривые и некрасивые. Какое решение тут можно применить, чтоб было кратенько и красиво?
Molotoff вне форума Ответить с цитированием
Старый 18.06.2009, 15:09   #2
Sazary
В тени
Старожил
 
Аватар для Sazary
 
Регистрация: 19.12.2008
Сообщений: 5,788
По умолчанию

Ну тут еще зависит от того, как строка задана. Например, если в одной строке только одно число, то можно как-нибудь так:
Код:
#include <iostream>
#include <conio.h>
#include <string>
using namespace std;

int main()
{
string s="Num. of variables = 63;";
int beg,end;
int k;
beg = s.find_first_of("0123456789");
end = s.find_last_of("0123456789");
k = atoi(s.substr(beg,end-beg+1).c_str());
cout<<k;

getch();
return 0;
}
Вполне очевидно, чтобы что-то понять, необходимо книги читать.
Не нужно плодить бессмысленных тем. Вас Поиск избавит от многих проблем.

___________________________________ ___________________________________ _______
[=Правила форума=]_____[Поиск]_____[Литература по С++]____[Литература. Паскаль]
Sazary вне форума Ответить с цитированием
Старый 18.06.2009, 16:11   #3
ROD
Linux C++ Qt ARM
Старожил
 
Аватар для ROD
 
Регистрация: 30.11.2008
Сообщений: 3,030
По умолчанию

Цитата:
beg = s.find_first_of("0123456789");
end = s.find_last_of("0123456789");
Ужас, до чего просто. А я бы сначало нашел бы знак "=", затем искал бы первый символ после пробела, затем переписывал бы все, что после пробела в другой массив, пока не встретил бы что-нибудь вроде конца строки или пробела ну или еще чего-нибудь (смотря сколько чисел в строке и вообще что в строке может быть) ну а потом использовал бы atoi();
А тут все в две строки уместилось.
Дилетант широкого профиля.

"Слова ничего не стоят - покажите мне код!" © Линус Торвальдс
ROD вне форума Ответить с цитированием
Старый 18.06.2009, 16:19   #4
Sazary
В тени
Старожил
 
Аватар для Sazary
 
Регистрация: 19.12.2008
Сообщений: 5,788
По умолчанию

Цитата:
Сообщение от ROD
А я бы сначало нашел бы знак "="
Ну тогда уж лучше сразу искать первый символ-цифру, а потом считывать в буфер, пока символ является цифрой. Можно и так. )
Вполне очевидно, чтобы что-то понять, необходимо книги читать.
Не нужно плодить бессмысленных тем. Вас Поиск избавит от многих проблем.

___________________________________ ___________________________________ _______
[=Правила форума=]_____[Поиск]_____[Литература по С++]____[Литература. Паскаль]
Sazary вне форума Ответить с цитированием
Старый 18.06.2009, 16:34   #5
ROD
Linux C++ Qt ARM
Старожил
 
Аватар для ROD
 
Регистрация: 30.11.2008
Сообщений: 3,030
По умолчанию

Цитата:
Ну тогда уж лучше сразу искать первый символ-цифру
Не уверен, ведь переменная в файле тоже может в имени содержать символы (ну например mounth1; mounth2;), ну а если в именах переменных заведомо нет цифр то да, можно начиная с первого числа.
Дилетант широкого профиля.

"Слова ничего не стоят - покажите мне код!" © Линус Торвальдс

Последний раз редактировалось ROD; 18.06.2009 в 16:42.
ROD вне форума Ответить с цитированием
Старый 18.06.2009, 16:43   #6
Sazary
В тени
Старожил
 
Аватар для Sazary
 
Регистрация: 19.12.2008
Сообщений: 5,788
По умолчанию

Цитата:
Сообщение от ROD
ведь переменная в файле тоже может в имени содержать символы (ну например mounth1; mounth2
Ну тогда и код из 2-го поста не подойдет )
Все зависит от того, что в файле.. Так сложно подобрать универсальное и красивое решение.

Можно, кстати, искать с конца точку с запятой, а потом первый пробел после нее слева.
Вполне очевидно, чтобы что-то понять, необходимо книги читать.
Не нужно плодить бессмысленных тем. Вас Поиск избавит от многих проблем.

___________________________________ ___________________________________ _______
[=Правила форума=]_____[Поиск]_____[Литература по С++]____[Литература. Паскаль]
Sazary вне форума Ответить с цитированием
Старый 18.06.2009, 18:14   #7
Molotoff
Пользователь
 
Регистрация: 01.04.2009
Сообщений: 20
По умолчанию

вы рассматриваете строку как string, у меня же она как массив char, собственно как с этим можно совладать?
P.S. в левой части только символы, цифры могут встречаться только после знака равно.
Molotoff вне форума Ответить с цитированием
Старый 18.06.2009, 18:19   #8
Sazary
В тени
Старожил
 
Аватар для Sazary
 
Регистрация: 19.12.2008
Сообщений: 5,788
По умолчанию

Тогда как-нибудь вот так:
Код:
#include <iostream>
#include <conio.h>
#include <string.h>
using namespace std;

int main()
{
char s[]="Num. of variables = 63;", *p, buf[100];
int beg,end;
int k;

p = strtok(s,"=");
p = strtok(NULL,";\n\0");
strcpy(buf,p);
k = atoi(buf);
cout<<k<<endl;

getch();
return 0;
}
Вполне очевидно, чтобы что-то понять, необходимо книги читать.
Не нужно плодить бессмысленных тем. Вас Поиск избавит от многих проблем.

___________________________________ ___________________________________ _______
[=Правила форума=]_____[Поиск]_____[Литература по С++]____[Литература. Паскаль]
Sazary вне форума Ответить с цитированием
Старый 18.06.2009, 18:37   #9
Molotoff
Пользователь
 
Регистрация: 01.04.2009
Сообщений: 20
По умолчанию

Все заработало, всем огромное спасибо в помощи в прикрутке чтения ini-файла к программе реализующей генетический алгоритм!
Molotoff вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как при нажатии на строку в Listbox передавать нажатую строку в переменную Михаил Юрьевич Общие вопросы Delphi 5 16.03.2009 12:59
Помогите распарсить строку Alexander1991 Помощь студентам 1 08.03.2009 22:33
Как лучше организовать базу данных типо как в ICQ Руслантус БД в Delphi 3 09.08.2008 23:57
Распарсить HTML Табурет Общие вопросы C/C++ 11 02.03.2008 19:26
Подскажите как лучше сделать Gendolff БД в Delphi 1 10.02.2007 08:47