operacje na stringach

0

Witam,
mam problem z ktorym nie moge sobie poradzic.

w pliku tekstowym w którejsc n-tej linijce tego pliku znajduje mi się ciąg znaków
">ala,samochod sobie jezdzi,samolot,123" (bez cudzyslowów " );

chciałym wczytac te wyraz zdania. kazde z nich do kolejki. zebym mial

  • ala
  • samochod sobie jezdzi
  • samolot
  • 123

ale nie wiem jak to zrobic.
probowalem uzyc funkcji stringowych. pos, copy itp. ale udalo mi się wydobyć tylko pierwszy wyraz ciągu.'

z góry dzieki za pomoc

0

Powiem tyle że to już było, wystarczyło poszukać:
http://4programmers.net/Forum/Delphi_Pascal/91342-Rozdzielenie_tekstu

0

stringstream da radę. A jak przecinki też połknie to można wykasować.

0
 
vector <string> wyrazy;
string buf = "ala,samochod sobie jezdzi,samolot,123";
for(int i=0;i<buf.size();i++){
	if(buf[i]==','){
	     wyrazy.push_back(buf.substr(0,buf.find(",")));
	     buf.erase(0,buf.find(",")+1);
	     i=0;
	}
}
wyrazy.push_back(buf.substr(0,buf.npos));
0

@up: pytanie dotyczy Pascala, nie C++. Jednak już odpowiedzi zostały udzielone. Ja dodam tylko, że mozna we FreePascalu też z {$MODE DELPHI} użyć poniższego kodu z modułem Classes w sekcji uses. Ewentualnie przerób sobie na dodawanie do dynamicznej tablicy zamiast to TStringList. Przy bardziej skomplikowanych tekstach w różnych "otoczkach" jak tagi html czy różne separatory można skorzystać z modułu dostepnego na: http://regexpstudio.com we FPC też się da go używać, bo sprawdziłem. Warunek to oczywiście dyrektywa {$MODE DELPHI}.

function Explode(Str : string; Separator : string) : TStringList;
var
  X : integer;
begin
  Result := TStringList.Create;
  X := Pos(Separator, Str);
  while X > 0 do
  begin
    Result.Add(Copy(Str, 1, X - 1));
    if X <= Length(Str) then
    begin
      Str := Copy(Str, X + Length(Separator), Length(Str));
    end;
    X := Pos(Separator, Str);
  end;
  if (Length(Str) > 0) then
  begin
    Result.Add(Str);
  end;
end;
1

Ponieważ lubię zawsze wszystkie kody skracać napisałem coś takiego:

for I := 1 to length(s) do
if s[i] <> ',' then tab[licz]:=  tab[licz]+ s[i] else inc(licz); // i to by było na tyle ;)

Mam nadzieję ,że większość osób się ze mną zgodzi ;)

0
ExtractStrings();

W pierwszym parametrze typu set podaj, po jakim znaku ma być rozdzielenie
W drugim (też typ set) podaj znaki które mają być wycięte ze stringa.
W trzecim parametrze podaj string który ma być rozdzielony (typ PAnsiChar).
W czwartym podaj obiekt do którego mają zostać wpisane rozdzielone stringi.

Przykład

ExtractStrings([',', ' '], ['.'], PChar('>ala,samochod sobie jezdzi,samolot,123'), TS);

Gdzie TS to obiekt klasy TStrings lub TStringList.

0

Jak już chcesz zabłysnąć TomRiddle to ta funkcja ma nazwę ExtractStrings z końcówką "s" bo o innej nie słyszałem.
Poza tym ta funkcja to dość gruby baleron :D

0

we FPC też się da go używać, bo sprawdziłem. Warunek to oczywiście dyrektywa {$MODE DELPHI}.
proponuję raczej {$MODE OBJFPC}, bo {$MODE DELPHI} wyłącza wiele rozszerzeń, które daje składnia FPC.

1 użytkowników online, w tym zalogowanych: 0, gości: 1