Losowanie tekstu ze stringu do drugiego
wiwi249
22.09.2014
Hej!
Mam mały problem, nie chcę się bachnąć.
Mam dwie tablice:
new tablica[5] formatex(tablica, charsmax(tablica), "abcde"); ... new tekst[8];
I teraz, za pomocą pętli for, uzupełniam tablicę tekst. Poprawnie to będzie, jeśli zrobię to w następujący sposób?
for(new i=0; i<=8; i++) { tekst[i] = tablica[random_num(0,4)]; }
Jeśli nie, jak to inaczej zrobić? Przeglądam dokumentację biblioteki string ale nie mam pomysłu.
Użytkownik wiwi249 edytował ten post 22.09.2014 21:57
GwynBleidD
22.09.2014
To kombinujesz w dobrą stronę, ale... to jeszcze nie to
Litera w programie komputerowym to nic innego, jak cyfra o odpowiedniej wartości... ale nie są to wartości od 0 do 4 (te są zarezerwowane dla specjalnych znaków), ale 65-90 dla wielkich liter i 97-122 dla małych. Ale nie trzeba tych wartości pamiętać, wystarczy użyć 'A' i 'Z' dla wielkich liter oraz 'a' i 'z' dla małych. Więc random_num('a', 'z') wylosuje małą literę. Jeśli chcesz losować wielkie lub małe, trzeba troszkę nakombinować.
I pamiętaj, że ostatni znak musi być KONIECZNIE nullem (czyli znakiem o numerze 0).
Tak, jak zrobiłeś również zadziała, ale jest trochę naokoło. Lepiej od początku uczyć się dobrych praktyk
wiwi249
22.09.2014
Czyli sugerujesz nie wykorzystywać w ogóle tablicy "tablica[5]" ? Rozumiem chyba. Skoro zadziała to okej, dzięki wielkie
G[o]Q
22.09.2014
Twój pomysł byłby dobry jesli chciałbyś losować tylko z jakiegoś wzorca (wzorzec to tablica) tyle że do Twojej tablicy możesz wpisać 4 znaki a nie 5 tak jak to zrobiłeś bo zawsze musisz zarezerwować sobie ostatni element na znacznik końca ciągu-znaków
sebul
23.09.2014
Chyba chciałeś napisać 7 znaków, a nie 8 ^ ^Twój pomysł byłby dobry jesli chciałbyś losować tylko z jakiegoś wzorca (wzorzec to tablica) tyle że do Twojej tablicy możesz wpisać 4 znaki a nie 5 tak jak to zrobiłeś bo zawsze musisz zarezerwować sobie ostatni element na znacznik końca ciągu-znaków
G[o]Q
23.09.2014
Chyba chciałeś napisać 7 znaków, a nie 8 ^ ^
new tablica[5]
EDIT
Wiem Sebul ale przestałem debbugować jak znalazłem pierwszy błąd
Użytkownik G[o]Q edytował ten post 23.09.2014 17:54
wiwi249
23.09.2014
w takim razie wedlug tego ma byc tak?
new tablica[5] formatex(tablica, charsmax(tablica), "abcd"); //tutaj 4 znaki jak tablica jest 5-znakowa? ... new tekst[9]; for(new i=0; i<=8; i++) { tekst[i] = tablica[random_num(0,4)]; //tutaj podobnie? }
GwynBleidD
23.09.2014
W przypadku tablicy źródłowej nie gra to roli, czy będzie null na końcu, czy nie, bo może go nie być... Tą tablicę traktujemy jako zbiór znaków, a nie jako string. Jednak żeby nulla na końcu nie było, musimy ją wypełnić mniej więcej w taki sposób:
new tablica[] = {'a', 'b', 'c', 'd', 'e'};
I absolutnie nic tu się złego nie stanie, jeśli każdy ze znaków będziemy używać osobno, a nie całość jako string. Nie możemy tego potraktować formatem, bo nam ten null na końcu wstawi (albo przynajmniej spróbuje).
Prawdziwy problem jest tu:
new tekst[9]; for(new i=0; i<=8; i++)
Jeśli tablicę docelową również masz zamiar użyć tak, jak źródłową, czyli każdy znak z osobna to nie ma się tu do czego przyczepić, ale jej nazwa wskazuje co innego...
Wypełniasz ją całą tekstem i na końcu nie ma miejsca na znak null. Pętla powinna wyglądać tak:
new tekst[9]; for(new i=0; i<8; i++)
a po pętli powinno znaleźć się jeszcze:
tekst[8] = '^0'
I taka przestroga na przyszłość, jeśli chcesz dodać tego nulla na końcu stringa to nie używaj nigdy:
tekst[8] = 0
nie chodzi tu o to, że to nie zadziała, bo zrobi dokładnie to co wyżej... chodzi o to, że poprzedni zapis od razu sugeruje, że operujemy na tekście, a nie na liczbach, więc jest od razu czytelniejszy nie tylko dla osoby trzeciej, ale też dla Ciebie gdy za tydzień, miesiąc, rok czy dwa zaglądniesz do kodu i będziesz się zastanawiał co tutaj miałeś na myśli.