powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Парсинг строки с++
25 сообщений из 26, страница 1 из 2
Парсинг строки с++
    #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
Парсинг строки с++
    #39268537
m_Sla
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Под отладчиком запускал?
...
Рейтинг: 0 / 0
Парсинг строки с++
    #39268539
Serega325
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
m_Sla,

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

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

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

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

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

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

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

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

Вот правильная рогатка с БК :)
...
Рейтинг: 0 / 0
Парсинг строки с++
    #39272262
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну спасибо док. Так еще до дубинки дойдем.
...
Рейтинг: 0 / 0
Парсинг строки с++
    #39272303
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мне strtok не нравится тем что она не совсем.... хм.... pure function. При прочих равных
условиях я-бы предпочел его не использовать вообще.
...
Рейтинг: 0 / 0
Парсинг строки с++
    #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
Парсинг строки с++
    #39272355
д0k
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
maytonМне strtok не нравится тем что она не совсем.... хм.... pure function. При прочих равных
условиях я-бы предпочел его не использовать вообще .

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

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

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

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





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

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

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



У вас ошибка. Нужно массив так инициалиировать:
Код: plaintext
1.
int* massNumber = new int[20];	
...
Рейтинг: 0 / 0
Парсинг строки с++
    #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
Парсинг строки с++
    #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
Парсинг строки с++
    #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
25 сообщений из 26, страница 1 из 2
Форумы / C++ [игнор отключен] [закрыт для гостей] / Парсинг строки с++
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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