Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / Парсинг строки с++ / 25 сообщений из 26, страница 1 из 2
06.07.2016, 10:08
    #39268534
Serega325
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Парсинг строки с++
Здравствуйте, помогите пожалуйста разобраться с проблемой. Я распарсил строку "col_1,col_2,col_3,col_1;". (мне нужно получить массив целых чисел 1, 2, 3, 1). Вот код:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
const char *first = str.c_str();
	       const char *last = first + strlen(first);
		int* massNumber = new int(20);	
		std::cmatch mr;
		std::string s = "";
		std::regex rx("col_[1-9][0-9]*");//\x020*[\,]?");
		int n = 0;
		while (std::regex_search(first, last, mr, rx))
		{
				if (mr.size() > 0)
				{
					s = mr.str().substr(4);
					massNumber[n] = atoi(s.c_str());;
					n++;
				}
				first = mr[0].second;
		}


Но после третей итерации возникает ошибка (error.jpg). Возникает только после третей итерации, т.е. если строка "col_1,col_2,col_3" состоит из трех col_n, то работает, но если col_n больше чем три, то

"An unhandled exception of type 'System.AccessViolationException' occurred in ReportSelector.exe
Additional information: Attempted to read or write protected memory. This is often an indication that other memory is corrupt."

Отлаживал по шагам (Step over), ошибка возникает на четвертой итерации при заходе в функцию std::regex_search(first, last, mr, rx). Кто-нибудь знает как решить эту проблему ? Может кто подскажет другие способы распарсить строку?
...
Рейтинг: 0 / 0
06.07.2016, 10:14
    #39268537
m_Sla
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Парсинг строки с++
Под отладчиком запускал?
...
Рейтинг: 0 / 0
06.07.2016, 10:17
    #39268539
Serega325
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Парсинг строки с++
m_Sla,

Запускал в Visual Studio 2015
...
Рейтинг: 0 / 0
06.07.2016, 17:12
    #39269137
alexy_black
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Парсинг строки с++
думаю потому что используются низкоуровневые фукнции.

http://en.cppreference.com/w/cpp/regex/regex_search тут есть подобный пример, только реализован по нормальному.
...
Рейтинг: 0 / 0
06.07.2016, 17:14
    #39269142
alexy_black
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Парсинг строки с++
...
Рейтинг: 0 / 0
07.07.2016, 15:52
    #39269939
Serega325
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Парсинг строки с++
alexy_black http://en.cppreference.com/w/cpp/regex/regex_iterator
Спасибо, статья помогла.
...
Рейтинг: 0 / 0
07.07.2016, 16:07
    #39269957
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Парсинг строки с++
Применять регулярки.... найти подстроку... а потом взять .substr(4) ...
...
Рейтинг: 0 / 0
08.07.2016, 06:05
    #39270236
CEMb
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Парсинг строки с++
maytonПрименять регулярки.... найти подстроку... а потом взять .substr(4) ...
Всё правильно, substr быстрее. И нагляднее :)
...
Рейтинг: 0 / 0
08.07.2016, 15:54
    #39270709
SashaMercury
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Парсинг строки с++
CEMbmaytonПрименять регулярки.... найти подстроку... а потом взять .substr(4) ...
Всё правильно, substr быстрее. И нагляднее :)

Насколько быстрее? И всегда ли?
Serega325 Здравствуйте, помогите пожалуйста разобраться с проблемой. Я распарсил строку "col_1,col_2,col_3,col_1;". (мне нужно получить массив целых чисел 1, 2, 3, 1). Вот код:

Если целые числа содержат одну цифру, то это одна задача, при этом совершенно тривиальная. Пройдите по символьной строке, и проверьте каждый символ на соответствие его определенному диапазону. Если целые числа состоят из нескольких цифр, то алгоритм будет несколько другой, но я уверен, что его вполне возможно реализовать
...
Рейтинг: 0 / 0
08.07.2016, 16:02
    #39270720
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Парсинг строки с++
Чувак из гаубицы стрельнул по воробышкам.

Потом подошел к дохлым птичкам и еще из рогатки добил.... для надежности.
...
Рейтинг: 0 / 0
11.07.2016, 10:46
    #39271638
alexy_black
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Парсинг строки с++
mayton,

почему?
иногда быстрее написать регулярку, чем написать алгоритм какой-то, который бы разобрал такую строку. а что если она потом поменяется? с регуляркой нужно будет просто изменить регулярку, а вот с алгоритмом будет труднее.
эсперемент я не проводил, но по-моему я напишу такой разбор с регуляркой с первого раза, а вот алгоритм придется отладить.. по мне - так это довод, чтобы юзать регулярку. если конечно мне не нужно разбирать эту строку раз 50 за секунду :)
...
Рейтинг: 0 / 0
11.07.2016, 11:50
    #39271681
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Парсинг строки с++
alexy_black, понимешь тут надо быть либо "беременной" либо "не-беременной". Вариант смешивания
технологий позразумевает что ты либо не до конца осилил работу с регулярками либо решил
что подключил гаубицу но тебе не хватило перформанса. Но в данном юзкейсе у нас стоит
на первом шаге работа регулярок а потом работа суб-строк и я делаю вывод что автор не делал
перформанс-тюнинг.

Я-бы эту задачу решал либо boost::split -ом либо c регулярками но используя правило
которое отбрасывает работу std::regex_search на самый последний шаг когда уже 100%
известно что выражение нам подходит и механизм регулярок точно необходим.
...
Рейтинг: 0 / 0
12.07.2016, 10:34
    #39272254
д0k
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Парсинг строки с++
mayton
Я-бы эту задачу решал либо boost:

Ты тоже по воробьям знатно из гаубицы пальнул.

Вот правильная рогатка с БК :)
...
Рейтинг: 0 / 0
12.07.2016, 10:52
    #39272262
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Парсинг строки с++
Ну спасибо док. Так еще до дубинки дойдем.
...
Рейтинг: 0 / 0
12.07.2016, 11:41
    #39272303
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Парсинг строки с++
Мне strtok не нравится тем что она не совсем.... хм.... pure function. При прочих равных
условиях я-бы предпочел его не использовать вообще.
...
Рейтинг: 0 / 0
12.07.2016, 12:32
    #39272349
д0k
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Парсинг строки с++
maytonМне strtok не нравится тем что она не совсем.... хм.... pure function. При прочих равных
условиях я-бы предпочел его не использовать вообще.


Вот тебе самая, что ненаесть православная, идеологичски скрепная рогатка
pure function



подсказка

[ Matches a nonempty sequence of characters from the specified set
of accepted characters; the next pointer must be a pointer to
char, and there must be enough room for all the characters in
the string, plus a terminating null byte. The usual skip of
leading white space is suppressed. The string is to be made up
of characters in (or not in) a particular set; the set is
defined by the characters between the open bracket [ character
and a close bracket ] character. The set excludes those charac‐
ters if the first character after the open bracket is a circum‐
flex (^). To include a close bracket in the set, make it the
first character after the open bracket or the circumflex; any
other position will end the set. The hyphen character - is also
special; when placed between two other characters, it adds all
intervening characters to the set. To include a hyphen, make it
the last character before the final close bracket. For
instance, [^]0-9-] means the set "everything except close
bracket, zero through nine, and hyphen". The string ends with
the appearance of a character not in the (or, with a circumflex,
in) set or when the field width runs out.

...
Рейтинг: 0 / 0
12.07.2016, 12:38
    #39272355
д0k
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Парсинг строки с++
maytonМне strtok не нравится тем что она не совсем.... хм.... pure function. При прочих равных
условиях я-бы предпочел его не использовать вообще .

Вообще, ты не умеешь их готовить .
что бы результат нравился , во время приготовления рекурсивно мыслить нужно...
...
Рейтинг: 0 / 0
12.07.2016, 12:41
    #39272357
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Парсинг строки с++
д0k, спасибо док.

Вместо гаубицы ты мне подкатил самую эксклюзивную и тяжелую пушку всех времен и народов.

...
Рейтинг: 0 / 0
12.07.2016, 12:48
    #39272362
д0k
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Парсинг строки с++
maytonд0k, спасибо док.

Вместо гаубицы ты мне подкатил самую эксклюзивную и тяжелую пушку всех времен и народов.





ты не шаришь,
это не гаубица и не пушка,

это индивидуальный универсальный переносной швейцарский нож - гранатомет ,
который всегда в кармане ...
...
Рейтинг: 0 / 0
12.07.2016, 14:26
    #39272441
CEMb
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Парсинг строки с++
maytonМне strtok не нравится тем что она не совсем.... хм.... pure function. При прочих равных
условиях я-бы предпочел его не использовать вообще.
Почему? Почему?

Btw, с ней надо аккуратно работать, да. Например, strtok в/между strtok не звать.
...
Рейтинг: 0 / 0
12.07.2016, 14:44
    #39272454
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Парсинг строки с++
CEMb, на чистых можно строить ФП и потокобезопасный код.
...
Рейтинг: 0 / 0
12.07.2016, 15:15
    #39272477
Парсинг строки с++
Serega325
Код: plaintext
1.
int* massNumber = new int(20);	



У вас ошибка. Нужно массив так инициалиировать:
Код: plaintext
1.
int* massNumber = new int[20];	
...
Рейтинг: 0 / 0
12.07.2016, 15:54
    #39272511
tehKosh
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Парсинг строки с++
Код: plaintext
1.
2.
3.
4.
  char* s = "col_1,col_13,col_145,col_1;";
  int r[20], rsize = -1;
  for (int n; sscanf(s, "col_%d%*[,;]%n", &r[++rsize], &n) != EOF; s += n)
    ;
...
Рейтинг: 0 / 0
12.07.2016, 18:32
    #39272620
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Парсинг строки с++
tehKosh, я-бы здесь использовал while.

Код: plaintext
1.
2.
3.
4.
5.
6.
  char* s = "col_1,col_13,col_145,col_1;";
  int r[20], rsize = -1;
  int n = 0;
  while(sscanf(s, "col_%d%*[,;]%n", &r[++rsize], &n) != EOF){
     s += n;
  }



так дебаггером степать удобнее.
...
Рейтинг: 0 / 0
13.07.2016, 15:03
    #39273169
tehKosh
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Парсинг строки с++
Код: plaintext
1.
2.
3.
4.
5.
6.
  char* s = " col_1 , col_13,  col_145,col_1;";
  int r[20], rsize = 0, n;
  while (sscanf(s, "%*[^0-9]%d%n", r + rsize, &n)) {
    s += n;
    rsize++;
  }
...
Рейтинг: 0 / 0
Форумы / C++ [игнор отключен] [закрыт для гостей] / Парсинг строки с++ / 25 сообщений из 26, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]