Mój algorytm SPLIT

0

No więc mam algorytm split do rozdzielania stringu i wygląda on następująco:

function split(input:string;schar:char;s:integer):string;
    var
       i,n:integer;
       schop: string;
    begin
       n := 1;
       for i := 1 to length(input) do
       begin
         if (input[i] = schar) then
         begin
           inc(n);
           if n = s then
           split := schop
           else
           schop := '';
           end
         else
           schop := schop + input[i];
         end;
    end;

kiedy chce podzielić taki string robie tak:

text_przed = '10 43 "Its Cool"';
text_po = split(text_przed,' ',2);

to wtedy text_po zamiast stać się Its Cool staje się "Its ponieważ funkcja rozdziela tekst po każdym znaku spacji a pomiędzy Its a Cool jest spacja więc to też rozdziela. I z tąd moja proźba czy mógł by mi ktoś dopisać do tej funkcji coś żeby tekst pomiędzy znakami "" ze spacją liczyła jako jedeną część? Wiecie żeby zamiast rozdzielone zwróciła całe. PLZZ POMOCY!!!

0

napisz jaka postac ma wczytywany tekst:
a.) staly uklad np 2 cyfry spacja 2 cyfry spacja slowo spacja slowo
b.) niereguralny

Mozna to zrobic np tak
znajdz pierwsza spacje i pomijaj co 2 spacje i dziel tak az do konca
Mozliwosci jest wiele ale napisz dokladnie jakie sa dane wejsciowe i jak chcesz je dzielic.
Mozna tez szukac az znajdzie 1 litere w tekscie i od tego czasu do konca zczytac calosc ze spacjami.
Pamietam ze delphi potrafi zwrocic cos takiego NAN (Not A Noumber)

0
function split(input:string;schar:char;s:integer):string;
    var
       i,n:integer;
       quote, //czy badany znak pochodzi z pomiedzy cudzyslowow
       is_quote, //czy aktualny znak to cudzyslow
       is_schar, //czy aktualny znak to schar i nie pochcodzi z pomiędzy cudzysłowow
       poprzedni_ok //czy poprzedni znak należy do wyrazu
       :bool;
    begin
       n := 1;
       quote := False;
       for i := 1 to length(input) do
       begin
         is_quote := input[i] = '"';
         is_schar := not quote and (input[i] = schar);
         if is_quote or is_schar then
         begin
           if quote or poprzedni_ok then
           begin
             inc(n);
             if n > s then Exit else Result := '';
           end;
           if is_quote then quote := not quote;
           poprzedni_ok := False;
         end else
         begin
           Result := Result + input[i];
           poprzedni_ok := True;
         end;
       end;
       if poprzedni_ok then inc(n); //zwiekszamy n jesli ostatni wyraz nie był policzony
       if n <= s then Result := ''; //gdy za malo wyrazów we frazie
    end;

var text_przed, text_po: string; i:integer;
begin
for i:=1 to 5 do
begin
  text_przed := '    10       43  "  Its Cool "  sdafas   sadfa     ';
  text_po := split(text_przed,' ',i);
  ShowMessage('''' + text_po + '''');
end;
0

Chyba się zakochałem :-) Dzięki adf88 i love 4programmers!

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