Ru-Board.club
← Вернуться в раздел «Прикладное программирование»

» Парсинг строк на C++

Автор: mediachance
Дата сообщения: 21.02.2008 22:18
Написал функцию для парсинга строк вида "строка1,строка2,строка3,строка4", чтобы вытаскивать элементы из строки по номеру индекса. Вроде бы работает нормально, но иногда результат не совсем тот:


Код: char* GetStringItem(const char* _string, int item, const char* delimiter)
{
char p[SIZE], copy[SIZE], *P;
P = StrStr(_string, delimiter);
if (P)
{
P += 1;
if (item != 1) return GetStringItem(P, item - 1, delimiter);
else
{
P = StrStr(lstrcpy(copy, _string), delimiter);
*P = 0;
lstrcpy(p, copy);
}
}
else if (item == 1) lstrcpy(p, _string);
else return NULL;
return p;
}
Автор: Abs62
Дата сообщения: 22.02.2008 08:03
mediachance

Цитата:
return p;

Низзя - при выходе из функции локальные переменные уничтожаются и указатель повисает в воздухе. Надо либо объявить p[SIZE] как static (тогда функция станет нереентеральной и её нельзя будет вызывать рекурсивно), либо выделять память под возвращаемую строку динамически (тогда в вызывающей программе надо не забыть её освободить во избежание утечек памяти).

PS. А почему StrStr, а не strchr?
Автор: mediachance
Дата сообщения: 22.02.2008 12:34

Цитата:
PS. А почему StrStr, а не strchr?

Ну это сейчас не принципиально
Ладно, объявлю тогда структуру с полем char[] и сделаю, чтоб функция возвращала экземпляр этого типа, тогда не должно проблем быть... Что-нибудь типа:

Код: typedef struct _STRING
{
char str[SIZE];
}
STRING;
Автор: Abs62
Дата сообщения: 22.02.2008 14:36
mediachance

Цитата:
Ладно, объявлю тогда структуру с полем char[] и сделаю, чтоб функция возвращала экземпляр этого типа,

С тем же успехом можно выделять память под строку в вызывающей программе, и передавать в функцию указатель на неё. Даже с большим - уйдёт неявное копирование при возврате из функции.

Страницы: 1

Предыдущая тема: 1C Программирование и поддержка


Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.