Problem z łańcuchem

0

Witam serdecznie, zauważyłem takie coś, że funkcja Copy coś krzaczy. Łańcuch ma następującą postać
S:=':1,2,3';
po użyciu funkcji
Copy(S,1,2); dostaję w wyniku ':1'
po użyciu Copy(S,2,1); dostaje w wyniku ''
a sęk w tym, że chcę dostać tylko '1' i nie wiem jak to zrobić, męczę się z tym już od wczoraj i krew mnie zalewa. Pomóżcie.

0
Copy(s, 2, 1);

Funkcja Copy, ma następujące parametry:

  1. String, z którego coś chcesz wyodrębnić
  2. Indeks znaku od którego chcesz zacząć wyodrębnianie
  3. Ilość znaków które chcesz wyodrębnić
0
procedure TForm1.Button1Click(Sender: TObject);
var
   s:string;
begin
   S:=':1,2,3';
   S:=Copy(S,2,1);
   ShowMessage(S);
end;

To też nie działa?

0
S := MidStr(S, 2, 1);

?

pzdr.

0

Wszystko to działa, jak zadeklaruję takiego właśnie stringa. Tylko problem w tym, że sprawa wygląda następująco. Dane zczytywane są z pliku tekstowego do tablicy stringów, a potem z tej tablicy stringów chcę wyciągnąć do tablicy integerów tylko wartości między przecinkami i dwukropkiem w przypadku pierwszej wartości.
Przykładowy plik wygląda tak:
6 // ta liczba określa ilość wymiarów, bo aplikacja ma wizualizować wielowymiarowość
:1,2,3,4,5,6 // a to są współżędne punktu
:2,1,3,4,5,5
:4,3,2,3,4,5

chcę zrobić zczytywanie tych danych z automatu, bo taki plik moze mieć więcej wymiarów i więcej punktów. Problem, że mam takie jaja z funkcją Copy, teraz sprawdziłem funkcję MidStr i też nie działa, tak samo jak funkcja LeftStr. Za każdym razem wyskakuje mi błąd, że wartość zapisywana do tablicy integerów nie jest wartością całkowitą. Usunięcie ':' z początku każdej lini też mi nic nie daje. Poniżej zamieszam kod odpowiadający temu zczytywaniu:

 for j:=0 to lo do //kazda linijka (prócz pierwszej) z pliku jako string 
  begin
    for z:=0 to length(tab[j]) do 
    l:=pos(',',tab[j]);                
    m:=pos(':',tab[j]);
    w:=MidStr(tab[j],m+1,l-1);    //pobranie poczynajac od ':' do znaku przed ','        
    tabz[z]:=StrToInt(w);
    delete(tab[j],1,1);
    end;

teraz pobiera mi '1,' i jakbym nie kombinował nigdy nie pobierze samej jedynki.

Pracuję na Delphi7.

0

Chyba nie czytałeś dokładnie dokumentacji..o ile w ogóle ;)

w:=MidStr(tab[j],m+1,l-1);

Trzeci parametr tej funkcji to ilość znaków, które mają być skopiowane...jeśli liczby będą jednocyfrowe, po prostu wrzuć 1 .. a jeśli mogą być kilkocyfrowe...to index przecinka - index dwukropka..lub wcześniejszego przecinka..

pzdr.

0

Robiłem tak właśnie i nie działa, jak wezme zeby czytalo dwie liczby to w wynikiu dostane '1,', a jak dam zeby zczytalo jedną liczbę to w tyniku dostaje '', a nie '1'.

0

Co nie zmienia faktu, że nie odpowiedziałeś, czy będą tam tylko jednocyfrowe liczby :P
Jeśli tak to może po prostu co drugi znak pobierać? ;)

pzdr.

0

Liczby 1 lub 2-cyfrowe.

0

Nie wiem na ile ten kod jest poprawny..ale działa :P

procedure GetNumb(Str : String; var Tab : Array of Integer);
var
  I, Count  : Integer;
  Len       : Integer;
  StrTemp   : String;
begin
  Count :=  0;

  Len :=  Length(Str);
  for I := 2 to Len do
  begin
    if Str[I] in ['0'..'9'] then
      StrTemp := StrTemp + Str[I]
    else
    begin
      Tab[Count] := StrToInt(StrTemp);
      StrTemp := '';
      Inc(Count);
    end;
  end;
  Tab[Count] := StrToInt(StrTemp);

end;

pzdr.

0

Działa :) samo w sobie, ale jak to wciepne do całego programu to się sypie. Wszystko działa jak łańcuchy są podawane na sztywno, lub generowane przez program, ale jak są zczytywane z pliku tekstowego to już nie chce działać.

0

Wiem w czym tkwi problem. Więc wygląda to tak.
Powyższy procedura działa dla jednego łańcucha, moje pytanie brzmi jak ją zautomatyzować w pętli, zeby obsłużyła wszystkie łańcuchy.Przypominam, że każdy łańcuch jest zapisany w:
array of string
a każdą liczbę z tego łańcucha chciałbym zapisać w
array of integer
Problem mam z indeksowaniem tej drugiej tablicy, bo wywołanie tej proceedury dla pierwszej komórki pierwszej tablicy, wypełnia mi pierwsze 6 komórek drugiej tablicy, kolejne wywołanie wypełnia te same 6 komórek. Może by tak zrobić tablice wielowymiarową? Może to by rozwiązało problem?? Tylko czy można deklarować tablice w trakcie wykonania programu? Bo przecież wymiar tej tablicy będzie zależał od ilości współrzędnych i ilości obiektów.

0

Właśnie teraz sobie uświadomiłem jaką palnąłem głupotę z tą tablicą wielowymiarową. Przecież w zupełności starczy mi tablica dwuwymiarowa. Kolumny to kolejne współrzędne, a wiersze kolejne punkty.

0

A tak przy okazji - nie możesz do zmiennej typu integer przypisać wartości łańcuchowej (nawet jednego znaku) ponieważ integer jest typem liczbowym (porządkowym), a string łańcuchowym
Jedynym rozwiązaniem jest zastosowanie procedury val(łańcuch, zmienna do której przypisujemy wartość, błąd). Błąd to wartość jaką przyjmie zmienna jeżeli nie ma możliwości zamiany łańcucha na liczbę.

przykładowy kod:

var a:integer;
s:string;

(...)

s:=':1,2';
val(copy(s,2,1),a,0);

na wyjściu a=1

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