List2->Delimiter='^';
List2->DelimitedText="Мама моет^раму";
for(int i=0;i<List2->Count;i++)
ShowMessage(List2->Strings);
Свойство Delimiter компонента TStringList
Код:
В List2 записываются три строки: "Мама", "моет", "раму". То есть по умолчанию пробел тоже считается разделителем, получается, что разделителя два. Как сделать так, чтобы пробел не принимался за знак разбиения строк на подстроки.
Два варианта. Перед разбиением заменить пробел например на '#', и после разбиения вернуть все обратно. Или разбить на отдельные строк вручную:
Код:
void splitSentence(TStringList *slist, String &str, char delim)
{
char *fst = str.c_str();
while(*fst!=0)
{
char *lst = strchr(fst, delim);
if(lst==NULL)
{
slist->Add(fst);
break;
}
*lst = 0;
slist->Add(fst);
*lst = delim;
fst = lst + 1;
}
}
{
char *fst = str.c_str();
while(*fst!=0)
{
char *lst = strchr(fst, delim);
if(lst==NULL)
{
slist->Add(fst);
break;
}
*lst = 0;
slist->Add(fst);
*lst = delim;
fst = lst + 1;
}
}
Код:
#include <vcl.h>
#pragma hdrstop
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
TStringList *List1=new TStringList,*List2=new TStringList;
int strnum=0;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
List1->LoadFromFile("F:\\base.txt");
for(int i=0;i<List1->Count;i++)
{
OemToChar(List1->Strings.c_str(),List1->Strings.c_str());
ListBox1->Items->Add(List1->Strings);
}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action)
{
delete List1,List2;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::ListBox1Click(TObject *Sender)
{
for(int i=0;i<ListBox1->Items->Count;i++)
{
if(ListBox1->Selected)
{
strnum=ListBox1->ItemIndex;
}
}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
List2->Clear();
List2->Delimiter='^';
List2->DelimitedText=List1->Strings[strnum];
for(int i=0;i<List2->Count;i++)
ShowMessage(List2->Strings);
}
#pragma hdrstop
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
TStringList *List1=new TStringList,*List2=new TStringList;
int strnum=0;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
List1->LoadFromFile("F:\\base.txt");
for(int i=0;i<List1->Count;i++)
{
OemToChar(List1->Strings.c_str(),List1->Strings.c_str());
ListBox1->Items->Add(List1->Strings);
}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action)
{
delete List1,List2;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::ListBox1Click(TObject *Sender)
{
for(int i=0;i<ListBox1->Items->Count;i++)
{
if(ListBox1->Selected)
{
strnum=ListBox1->ItemIndex;
}
}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
List2->Clear();
List2->Delimiter='^';
List2->DelimitedText=List1->Strings[strnum];
for(int i=0;i<List2->Count;i++)
ShowMessage(List2->Strings);
}
Подскажите, где ошибка?
Если добавить List2->QuoteChar='^' и задать текст в виде "мама мыла"^"раму", то работать будет, а так он разделителем пробел по умолчанию считает.
Ты имеешь ввиду создать строку вида: AnsiString str="мама мыла"+'^'+"раму"? А какая разица? Или я что-то не понял? А с QuoteChar я пробовал, все равно пробелы разбивает.
Код:
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
TStringList *List1=new TStringList;
List1->LoadFromFile("F:\\base.txt");
for(int i=0;i<List1->Count;i++)
{
OemToChar(List1->Strings.c_str(),List1->Strings.c_str());
char *fst = List1->Strings.c_str();
while(*fst!=0)
{
char *lst = strchr(fst, '^');
if(lst==NULL)
{
ListBox1->Items->Add(fst);
break;
}
*lst = 0;
ListBox1->Items->Add(fst);
*lst = '^';
fst = lst + 1;
}
}
delete List1;
}
: TForm(Owner)
{
TStringList *List1=new TStringList;
List1->LoadFromFile("F:\\base.txt");
for(int i=0;i<List1->Count;i++)
{
OemToChar(List1->Strings.c_str(),List1->Strings.c_str());
char *fst = List1->Strings.c_str();
while(*fst!=0)
{
char *lst = strchr(fst, '^');
if(lst==NULL)
{
ListBox1->Items->Add(fst);
break;
}
*lst = 0;
ListBox1->Items->Add(fst);
*lst = '^';
fst = lst + 1;
}
}
delete List1;
}