C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
Разбиение строки на массив строк по разделителю..., как реализовать?
Zeran
Отправлено: 26.07.2006, 22:42


Не зарегистрирован







Помогие пожалуйста!Нужно разбить строку на массив строк по определенному разделителю, например:
сделать из строки "один:два:три" массив где 1й елемент = "один", второй "два" а третий "три".В C#, PHP, VB для етого предусмотрена ф-ция Split(), и Join для обратной операции, в С++ я же такого не нашел.
Подскажите плиз как реализовать такое дело?Очень нужно, уже 3 дня не могу с етим разобраться, перерыл string.h и ничего sad.gif
Заранее благодарен за помощь!
AVC
Отправлено: 27.07.2006, 08:16


Ветеран

Группа: Модератор
Сообщений: 1583



QUOTE

Подскажите плиз как реализовать такое дело?

Например так: меняем в строке символ разделитель на '\n', затем StringList...->Text = ваша_новая_строка. Доступ к строкам StringList...->Strings[i].
Gedeon
Отправлено: 27.07.2006, 09:05


Ветеран

Группа: Модератор
Сообщений: 1742



QUOTE (AVC @ 27/07/2006, 08:16)
Например так: меняем в строке символ разделитель на '\n',

Это можно сделать например с помощью AnsiReplaceText, но если текст больших размеров, то будет долго, тада проще руками.
Doga
Отправлено: 27.07.2006, 12:01


Мастер участка

Группа: Участник
Сообщений: 575



Тут уже была подобная тема:
https://rxlib.ru/forums/index.php?ac...1460c49223c5d09
ROLpogo
Отправлено: 29.07.2006, 00:28


Ученик-кочегар

Группа: Участник
Сообщений: 12



Дёшево, и сердито, зато работает smile.gif

CODE

#include <conio.h>
#include <iostream.h>
#include <string.h>

char** ConvertStringToDimString(char* Source,char** Dest,char Devider,int& NumStr)
{
int SLen=strlen(Source);
int MaxLen=0;
int PrevPosition=0;
NumStr=0;
int CurLen;
for(int i=0;i<SLen;i++)
if(Source[i]==Devider)
{
if(i==PrevPosition)
{
if(i==SLen-1)
NumStr--;
PrevPosition++;
}
else
{
CurLen=i-PrevPosition;
if(CurLen>MaxLen)
MaxLen=CurLen;
if(i!=SLen-1)
NumStr++;
PrevPosition=i+1;
}
}
if(!MaxLen)
return Dest;
CurLen=SLen-PrevPosition;
if(CurLen>MaxLen)
MaxLen=CurLen;
NumStr++;
Dest=new char*[NumStr];
for(int i=0;i<NumStr;i++)
Dest[i]=new char[MaxLen+1];
PrevPosition=0;
int NStr=0;
for(int i=0;i<SLen;i++)
if(Source[i]==Devider)
{
if(i==PrevPosition)
PrevPosition++;
else
{
CurLen=i-PrevPosition;
strncpy(Dest[NStr],&Source[PrevPosition],CurLen);
Dest[NStr][CurLen]='\0';
NStr++;
PrevPosition=i+1;
}
}
CurLen=SLen-PrevPosition;
if(CurLen)
{
strncpy(Dest[NStr],&Source[PrevPosition],SLen-PrevPosition);
Dest[NStr][CurLen]='\0';
}
return Dest;
}

void main(void)
{
clrscr();
char** DimStr=NULL;
int NumStrings=0;
char* MyStr={"one:two:three:four"};
cout<<MyStr<<"\n\n";
DimStr=ConvertStringToDimString(MyStr,DimStr,':',NumStrings);
if(DimStr)
{
for(int i=0;i<NumStrings;i++)
cout<<DimStr[i]<<"\n";
for(int i=0;i<NumStrings;i++)
delete []DimStr[i];
delete []DimStr;
}
getch();
}


Отредактировано ROLpogo — 29/07/2006, 00:30
** pirs
Отправлено: 31.07.2006, 00:12


Не зарегистрирован







Функция из string.h :
char* strtok(char *s1, const char *s2)
Смотри Архангельский "Программирование c++builder 5" стр. 921

Вернуться в Вопросы программирования в C++Builder