explode

dział ogólny

explode

Nowy postprzez wargo » czwartek, 17 lipca 2008, 14:15

Jak rozdzielić jakiś ciąg odpowiednim separatorem i wyświetlić wybrany element z listy rozdzielonej?
Chodzi mi odpowiednik funkcji explode w php.
Kod: Zaznacz cały

<?
$str 
"a, b, c, d, e";
$x explode(", "$str);//s
echo"4 litera to {$x["3"]}";//numerowane od zera
?>
Ostatnio edytowano czwartek, 26 lutego 2009, 22:23 przez wargo, łącznie edytowano 1 raz
Avatar użytkownika
wargo
Mądrosław
Mądrosław
 
Posty: 389
Dołączył(a): niedziela, 13 lipca 2008, 16:44
PodziÄ™kowaÅ‚ : 12
OtrzymaÅ‚ podziÄ™kowaÅ„: 3
System operacyjny: Windows 7
Kompilator: C++ Builder 6 Personal
Gadu Gadu: 6259515
    NieznanyNieznana

Re: explode

Nowy postprzez Cyfrowy Baron » czwartek, 17 lipca 2008, 14:29

Nie wszystko zrozumiałem, szczególnie tego rozdzielania, ale jeżeli masz jakiś ciąg znaków i chcesz pobrać jeden z tych znaków to prostu podajesz jego numer:
Kod: Zaznacz cały
void __fastcall TForm1::Button4Click(TObject *Sender)
{
String tekst = "abcde";
String x = tekst[4]; // czwarta litera numerowanie od 1

ShowMessage("Czwarta litera to: " + x);
}


Możesz też stworzyć tablicę znaków:
Kod: Zaznacz cały
void __fastcall TForm1::Button4Click(TObject *Sender)
{
String tekst[] = {"a", "b", "c", "d", "e"};
String x = tekst[3]; // czwarta litera numerowanie od 0

ShowMessage("Czwarta litera to: " + x);
}


Można też krócej:
Kod: Zaznacz cały
{
String tekst1[] = {"a", "b", "c", "d", "e"};
String tekst = "abcde";

ShowMessage("Czwarta litera to: " + tekst1[3]);
ShowMessage("Czwarta litera to: " + (String)tekst[4]); // zwróć uwagę na rzutowanie zmiennej String
}

W C++ każdy łańcuch znaków, jest tablicą. Można to też robić z wykorzystaniem takich funkcji jak SubString, Pos, wszystko zależy od tego, co chcesz zrobić.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
PodziÄ™kowaÅ‚ : 12
OtrzymaÅ‚ podziÄ™kowaÅ„: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    NieznanyNieznana

Re: explode

Nowy postprzez wargo » czwartek, 17 lipca 2008, 14:47

Nawet nie wiedziałem że to takie łatwe :shock:
spróbuję.
Avatar użytkownika
wargo
Mądrosław
Mądrosław
 
Posty: 389
Dołączył(a): niedziela, 13 lipca 2008, 16:44
PodziÄ™kowaÅ‚ : 12
OtrzymaÅ‚ podziÄ™kowaÅ„: 3
System operacyjny: Windows 7
Kompilator: C++ Builder 6 Personal
Gadu Gadu: 6259515
    NieznanyNieznana

Re: explode

Nowy postprzez wargo » czwartek, 17 lipca 2008, 14:51

Zapomniałem, chodzi mi o dowolny separator.
Avatar użytkownika
wargo
Mądrosław
Mądrosław
 
Posty: 389
Dołączył(a): niedziela, 13 lipca 2008, 16:44
PodziÄ™kowaÅ‚ : 12
OtrzymaÅ‚ podziÄ™kowaÅ„: 3
System operacyjny: Windows 7
Kompilator: C++ Builder 6 Personal
Gadu Gadu: 6259515
    NieznanyNieznana

Re: explode

Nowy postprzez Cyfrowy Baron » czwartek, 17 lipca 2008, 16:03

No ale o co chodzi z tym separatorem?! :roll:
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
PodziÄ™kowaÅ‚ : 12
OtrzymaÅ‚ podziÄ™kowaÅ„: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    NieznanyNieznana

Re: explode

Nowy postprzez wargo » czwartek, 17 lipca 2008, 16:07

mam różne ciągi znaków/wyrazów oddzielone każdy czymś np. innym znakiem.

k = "a, b, c, d"//przecinki omówiliśmy i bez nich też.
l = "m|n|o|p|r" //jak wyświetlić z tego literę "n" jeśli separatorem wartości jest '|' ?
Ostatnio edytowano piątek, 4 września 2009, 19:49 przez wargo, łącznie edytowano 2 razy
Avatar użytkownika
wargo
Mądrosław
Mądrosław
 
Posty: 389
Dołączył(a): niedziela, 13 lipca 2008, 16:44
PodziÄ™kowaÅ‚ : 12
OtrzymaÅ‚ podziÄ™kowaÅ„: 3
System operacyjny: Windows 7
Kompilator: C++ Builder 6 Personal
Gadu Gadu: 6259515
    NieznanyNieznana

Re: explode

Nowy postprzez Cyfrowy Baron » czwartek, 17 lipca 2008, 16:49

W bibliotekach C++ builder nie istnieje funkcja, która realizowałaby to zadanie, ale ten język ma to do siebie, że można w nim tworzyć własne funkcje, dlatego możesz stworzyć własną funkcję realizującą to zadanie i może nazywać się explode
Kod: Zaznacz cały
AnsiString explode(String tekst, String sep, int index) // funkcja własna
{
if(index <= 0)
{
  ShowMessage("Funkcja oczekuje wartoÅ›ci wiÄ™kszej od zera!");
  return "";
}
String Result = "";
__int8 c = 0;;
if(index > 1) c = 1;

for(int i = 0; i < index - c; i++)
{
  int x = tekst.Pos(sep);
  if(x <= 0 && index > 1)
  {
   ShowMessage("Podany ciÄ…g znaków zawiera tylko " + (String)(i + 1) + " rekordów!");
   return "";
  }
  if(index > 1) tekst = tekst.Delete(1, x + 1);
  int y = tekst.Trim().Pos(sep);
  if(y > 0 ) Result = tekst.SubString(1, y - 1);
  else Result = tekst.SubString(1, tekst.Length());
}

return Result.Trim();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender) //zdarzenie OnClick dla przycisku Button1
{
String txt = "ala, b, c, darek, elf, foka, kot";
Edit2->Text = explode(txt, ",", 0);
}

funkcja explode pobiera trzy argumenty, pierwszy to przeszukiwany łańcuch znaków, drugi argument to separator użyty w łańcuchu znaków, trzeci argument to poszukiwany rekord.
Funkcja została skonstruowana w taki sposób, że może poszukiwać nie tylko pojedyncze litery, ale całe wyrazy rozdzielone separatorem.

Za ten post autor Cyfrowy Baron otrzymał podziękowanie od:
wargo
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
PodziÄ™kowaÅ‚ : 12
OtrzymaÅ‚ podziÄ™kowaÅ„: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    NieznanyNieznana

Re: explode

Nowy postprzez Koziol » niedziela, 20 lipca 2008, 18:02

Nie łatwiej przeszukac kod - zródło PHP w dowolnej wersji i znaleźć kod odpowiadający za tę funkcje, skompilować jako dll i przyłaczyć do projektu ??

Z tego co mi się wydaje PHP jest napisane w ANSI C więc nie powinno być problemów...
Avatar użytkownika
Koziol
Intelektryk
Intelektryk
 
Posty: 144
Dołączył(a): niedziela, 13 lipca 2008, 17:36
PodziÄ™kowaÅ‚ : 8
OtrzymaÅ‚ podziÄ™kowaÅ„: 2
System operacyjny: Windows XP Pro SP2
Kompilator: C++ Builder
    NieznanyNieznana

Re: explode

Nowy postprzez Cyfrowy Baron » niedziela, 20 lipca 2008, 19:21

Koziol napisał(a):Nie łatwiej przeszukac kod - zródło PHP w dowolnej wersji i znaleźć kod odpowiadający za tę funkcje, skompilować jako dll i przyłaczyć do projektu ??.



.. i to miało by być prościej, niż włączenie w kod programu prostej funkcji.
Idąc Twoim tropem, można by zamiast pisania programów, tworzyć kody skryptowe i używać tylko przeglądarki internetowej... :D
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
PodziÄ™kowaÅ‚ : 12
OtrzymaÅ‚ podziÄ™kowaÅ„: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    NieznanyNieznana

Re: explode

Nowy postprzez wargo » niedziela, 20 lipca 2008, 21:19

Tylko gdzie znaleźć taki kod php, oni chyba tego nie mają open source. Ale dobre z tą przeglądarka :D
Avatar użytkownika
wargo
Mądrosław
Mądrosław
 
Posty: 389
Dołączył(a): niedziela, 13 lipca 2008, 16:44
PodziÄ™kowaÅ‚ : 12
OtrzymaÅ‚ podziÄ™kowaÅ„: 3
System operacyjny: Windows 7
Kompilator: C++ Builder 6 Personal
Gadu Gadu: 6259515
    NieznanyNieznana

Re: explode

Nowy postprzez Koziol » poniedziaÅ‚ek, 21 lipca 2008, 18:53

Cyfrowy Baron napisał(a):
Koziol napisał(a):Nie łatwiej przeszukac kod - zródło PHP w dowolnej wersji i znaleźć kod odpowiadający za tę funkcje, skompilować jako dll i przyłaczyć do projektu ??.



.. i to miało by być prościej, niż włączenie w kod programu prostej funkcji.
Idąc Twoim tropem, można by zamiast pisania programów, tworzyć kody skryptowe i używać tylko przeglądarki internetowej... :D


chodzi mi o źródło PHP np ver 5.x.x a nie o skrypt napisany w PHP :P

Poszukam może uda mi się znaleźć :)

EDIT:

Znalazłem.
explode.c
Nie masz wystarczających uprawnień, aby zobaczyć pliki załączone do tego postu.
Avatar użytkownika
Koziol
Intelektryk
Intelektryk
 
Posty: 144
Dołączył(a): niedziela, 13 lipca 2008, 17:36
PodziÄ™kowaÅ‚ : 8
OtrzymaÅ‚ podziÄ™kowaÅ„: 2
System operacyjny: Windows XP Pro SP2
Kompilator: C++ Builder
    NieznanyNieznana

Re: explode

Nowy postprzez wargo » poniedziaÅ‚ek, 21 lipca 2008, 20:43

Sam plik nie wystarczy bo jeszcze sa potrzebne główne kody i już wiem że przy kompilacji będzie błąd ale zostanę przy starym jednak czy można jakoś policzyć indexy?
Avatar użytkownika
wargo
Mądrosław
Mądrosław
 
Posty: 389
Dołączył(a): niedziela, 13 lipca 2008, 16:44
PodziÄ™kowaÅ‚ : 12
OtrzymaÅ‚ podziÄ™kowaÅ„: 3
System operacyjny: Windows 7
Kompilator: C++ Builder 6 Personal
Gadu Gadu: 6259515
    NieznanyNieznana

Re: explode

Nowy postprzez Koziol » poniedziaÅ‚ek, 21 lipca 2008, 21:25

Ja pokazałem tylko fragment nie zastanawiałem się co konkretnie trzeba z kodu wyłuskać.
Avatar użytkownika
Koziol
Intelektryk
Intelektryk
 
Posty: 144
Dołączył(a): niedziela, 13 lipca 2008, 17:36
PodziÄ™kowaÅ‚ : 8
OtrzymaÅ‚ podziÄ™kowaÅ„: 2
System operacyjny: Windows XP Pro SP2
Kompilator: C++ Builder
    NieznanyNieznana

Re: explode

Nowy postprzez Cyfrowy Baron » poniedziaÅ‚ek, 21 lipca 2008, 21:54

Rozumiem, że przez Indeksy rozumiesz liczbę rekordów przechowywanych w łańcuchy znaków..?
Jeżeli tak to najlepiej stworzyć drugą funkcję o takiej samej nazwie (chociaż to nie jest konieczne), takie wystąpienie dwóch lub więcej funkcji o tej samej
nazwie lecz różnych argumentach nazywa się przeciążeniem funkcji. Funkcja będzie zwracała liczbę rekordów oddzielonych separatorem w łańcuchu znaków:

Kod: Zaznacz cały
//---------------------------------------------------------------------------
int explode(String tekst, String sep)
{
int y = 0;
for(int i = 0; i <= tekst.Length(); i++)
{
  int x = tekst.Pos(sep);
  if(x >= 1 && x < tekst.Length()) // x < tekst.Length() - zabezpieczenie przed separatorem na koÅ„cu
  {
   tekst = tekst.Delete(1, x + 1);
   y++;
  }
}
return y + 1;
}
//---------------------------------------------------------------------------
AnsiString explode(String tekst, String sep, int index)
{
if(index <= 0)
{
  ShowMessage("Funkcja oczekuje wartoÅ›ci wiÄ™kszej od zera!");
  return "";
}
String Result = "";
__int8 c = 0;;
if(index > 1) c = 1;

for(int i = 0; i < index - c; i++)
{
  int x = tekst.Pos(sep);
  if(x <= 0 && index > 1)
  {
   ShowMessage("Podany ciÄ…g znaków zawiera tylko " + (String)(i + 1) + " rekordów!");
   return "";
  }
  if(index > 1) tekst = tekst.Delete(1, x + 1);
  int y = tekst.Trim().Pos(sep);
  if(y > 0 ) Result = tekst.SubString(1, y - 1);
  else Result = tekst.SubString(1, tekst.Length());
}

return Result.Trim();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button5Click(TObject *Sender)
{
String txt = "ala, b, c, darek, elf, foka, kot";

Edit2->Text = explode(txt, ",", 1);
Edit3->Text = "Tekst zawiera: " + (String)explode(txt, ",") +
                " rekordów rozdzielonych znakiem ','";
}
//---------------------------------------------------------------------------


Jeżeli potrzebujesz to możesz sobie połączyć te funkcje w jedną:
Kod: Zaznacz cały
AnsiString explode(String tekst, String sep, int index, int &rec)
{
if(index <= 0)
{
  ShowMessage("Funkcja oczekuje wartoÅ›ci wiÄ™kszej od zera!");
  return "";
}
String Result = "";
__int8 c = 0;;
if(index > 1) c = 1;
String tekst2 = tekst;

rec = 0;
for(int i = 0; i < tekst2.Length(); i++)
{
  int y = tekst2.Pos(sep);
  if(y >= 1 && y < tekst2.Length())
  {
   tekst2 = tekst2.Delete(1, y + 1);
   rec++;
  }

  if(i < index - c)
  {
   int x = tekst.Pos(sep);
   if(x <= 0 && index > 1)
   {
   ShowMessage("Podany ciÄ…g znaków zawiera tylko " + (String)(i + 1) + " rekordów!");
   }
   if(index > 1) tekst = tekst.Delete(1, x + 1);
   int y = tekst.Trim().Pos(sep);
   if(y > 0 ) Result = tekst.SubString(1, y - 1);
   else Result = tekst.SubString(1, tekst.Length());
  }
}
   rec = rec + 1;
return Result.Trim();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button6Click(TObject *Sender)
{
String txt = "ala, b, c, darek, elf, foka, kot";
int records;
Edit1->Text = "Poszukiwany rekord: " + explode(txt, ",", 7, records) +
", wszystkich rekordów jest: " + (String)records;
}
//---------------------------------------------------------------------------


I na koniec taka luźna uwaga: programowanie nie polega na powielaniu gotowych rozwiązań, lecz na poszukiwaniu nowych, własnych.

Za ten post autor Cyfrowy Baron otrzymał podziękowanie od:
wargo
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
PodziÄ™kowaÅ‚ : 12
OtrzymaÅ‚ podziÄ™kowaÅ„: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    NieznanyNieznana

Re: explode

Nowy postprzez Koziol » poniedziaÅ‚ek, 21 lipca 2008, 22:22

Taki krótki oftop nie ma co odbiegać od głównego tematu.
Wychodzę z założenia - po co pisać nowy kod jeżeli już jest jakiś, który jest na tyle dobry że nie jest już rozwijany. W oparciu o tę zasadę został stworzony chociażby "język" java.
Avatar użytkownika
Koziol
Intelektryk
Intelektryk
 
Posty: 144
Dołączył(a): niedziela, 13 lipca 2008, 17:36
PodziÄ™kowaÅ‚ : 8
OtrzymaÅ‚ podziÄ™kowaÅ„: 2
System operacyjny: Windows XP Pro SP2
Kompilator: C++ Builder
    NieznanyNieznana

Następna strona

Powrót do Ogólne problemy z programowaniem

Kto przeglÄ…da forum

Użytkownicy przeglądający ten dział: Brak zalogowanych użytkowników i 5 gości