wyszukiwanie liczb z ciągu znaków i zapisywanie do pozycji w tablicy

0

Witam... :)

Mam taki problem...
Napisałem pętlę która wychwytuje z ciągu x;x;x;x liczby (gdzie x-to liczba), problem pojawia się wtedy gdy liczba jest dwucyfrowa np. 12, wtedy cyfrę 1 program zapisuje do pierwszej pozycji w tablicy, a cyfrę 2 w drugiej pozycji. Chciałbym żeby całe liczby były zapisywane w pojedynczej pozycji w tablicy, a gdy pojawi się średnik przeskakiwało na drugą pozycję i zapisywało w kolejnej pozycji np. 12;4;83;7 12->pierwsza pozycja w tablicy, 4-> druga itd.

Pętla wygląda tak:

       AnsiString a = Edit1->Text;
        int tab1[10];
        int i=1;
        int j=1;
        while(i <= a.Length())
        {
               char znak = a[i];
                if(znak != ';')
                {
                        float p=StrToFloat(znak);
                        tab1[j]=p;
                        j++;
                }
                i++;
        }

Mam nadzieję, że dosyć jasno napisałem o co mi chodzi...
Będę bardzo wdzięczny za pomoc... :)

Pozdrawiam... ;)

0

Proszę, formatuj kod.
Z zastosowanych typów i funkcji widzę, że piszesz w borlandzie.

Nie wiem, jak wygląda kwestia strumieni dla wymysłu borlanda, ale wygodnym rozwiązaniem byłoby przejechać po całym stringu, zamieniając średniki na spacje, i jednocześnie liczyć ile ich mamy w ciągu, a następnie użyć stringstream'a:

stringstream s;
s << a;
	
for(int i = 0 ; i < ile ; ++i)
	s >> tab1[i];

Dodam tylko, że stringstream jest w <sstream>, oraz przestrzeni nazw std.
Sprawdziłbym to pod borlandem, ale nie mam tego środowiska pod ręką.

0

Dzięki, w którym miejscu miałbym umieścić ten wycinek co napisałeś? :)

Może pomoże ktoś kto ma zainstalowanego Borlanda na swoim kompie... :)

0

Parafrazujac mój poprzedni post: zaraz po zliczeniu ilości liczb i zamianie średników na spacje.

AnsiString a = Edit1->Text;
int tab1[10];
int ile=1;

//Zliczanie ilosci liczb do "ile", oraz zamiana ';' na ' '
for(int i=1; i<=a.Length(); ++i)
{
	if(';'==a[i])
	{
		ile++;
		a[i]=' ';
	}
}	

//utworzenie stringstream'a i zapelnienie do liczbami
stringstream s;
s << a;

//wypakowanie każdej liczby z osobna na wlaściwy indeks do tablicy	
for(int i = 0 ; i < ile ; ++i) 
	s >> tab1[i];

Powyższy kod zakłada, że wprowadzone dane nie są złośliwe, tzn. nie zaczynają się i nie kończą średnikami, oraz średniki zaraz po sobie się nie powtarzają.

0

Dzięki wielkie... :)
Pozostał chyba tylko jeden problem... Pojawił się błąd przy kompilacji...

[C++ Error] Unit1.cpp(51): E2094 'operator<<' not implemented in type '_STL::stringstream' for arguments of type 'AnsiString'
0

W takim wypadku spróbuj przed operacjami przerzutować AnsiString na klasyczy std::string, przy czym pamiętaj że std::string indeksowany jest od 0 do n-1, co musisz uwzględnić w pętli robiącej spacje ze średników.

0

AnsiString ma metodę c_str (tak samo jak w std::string), jej użyj tj. s << a.c_str().

0

Ja kiedyś napisałem sobie coś takiego:

 
char tablica[] = "120;12;256;44;";
char liczba[4][10];
int liczby[10];
int pozycjay=0;
int pozycjax=0;
for(int n=0; n<strlen(&tablica[0]); n++)
{
     if(tab[n] == ';')
     {
           liczby[pozycjay] = atoi(&liczba[pozycjay][0]);
           cout<<"liczba "<<pozycjay<<" = "<<liczby[pozycjay]<<endl;
           pozycjay++;
           pozycjax = 0;
     }
     else
     {
           liczba[y][x] = tablica[n];
           pozycjax++;
     }
}

Może ci się do czegoś przyda

0

Dzięki wielkie panowie... Wszystko się przyda... :)

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