qq
c=pp: DZIADEK MRÓZ JESTEŚ?
MAM PYTANIE Z CPP
18 cze 18:07
c=pp: pytanie jest następujące:
zakładamy, że mamy jakiś napis (TO JEST TABLICA CHAR);
przekazuje do funkcji np coś takiego: char z = funkcja ("To jest tekst");
char funkcja (char * napis);
jeśli sobie zwiększam adres napisu, to trafię w końcu na znak '\0', zgadza się,
no tak.
ale teraz jestem na pozycji '\0'
i chce być na pozycji ostatniej litery tej tablicy, a więc
−−napis;
i teraz mam pytanie, jeśli wykonuje coś takiego
while(*napis)
{
−−napis;
}
to trafiam z lewej strony (po przejściu przez wszystkie litery z prawej do lewej) również na
znak '\0', tylko skąd
się on bierze tam? i czy jest zawsze?
18 cze 18:12
c=pp: chodzi mi o to,
mam string , który przesyłam jako tablice charów:
ABCDEF
po F jest '\0'
ALE TERAZ dekrementując adres z pocyzji '\0'
trafiam na A, a następnie przed A trafiam na '\0'
SKĄD W TYM MIEJSCU W KOMORCE PAMIĘCI WZIĘŁO SIĘ '\0'
I CZY JEST TAK ZAWSZE?
powiedzmy piszę program, i boje sie że sytuacja taka nie trafi się zawsze, i pętla moze działać
dłużej
i wywołać nieporządane skutki w programie
18 cze 18:16
g: Nie ma gwarancji że \0 jest przed stringiem. Jeśli było, to przypadkiem, a tak naprawdę, to
sięganie do tego miejsca jest nielegalne.
Rozwiązaniem tego problemu jest zapamiętanie początkowej wartości 'napis' i porównywanie
pointerów.
while (1) {
//tu coś robisz z *napis
//następnie przechodzisz do poprzedniej litery
if (napis == napispoczatkowy) break; //to już była pierwsza litera stringu, koniec pętli
−−napis;
}
18 cze 18:26
c=pp: dzięki g, właśnie zastanawiałem się nad tym czy pamięć pamięć zawsze po lewej stronie od
stringa przechowuje
'\0'
dzięki, dobry pomysł z breakiem i zapamiętaniem pierwszej wartości napisu
18 cze 18:34
c=pp: no jest w sumie problem
a jeśli ta wartość początkowa char'a się powtórzyła gdzieś po drodze dekremetując, to wcześniej
mi zakonczy pracę,
może lepszym rozwiązaniem będzie porównanie adresów ?
18 cze 18:38
c=pp: znaczy zapamiętanie adresu początkowego?
18 cze 18:39
c=pp: czy to dobra praktyka?
18 cze 18:39
c=pp: aj, zauważyłem, że domyślnie miałeś na myśli adres w instrukcji warunkowej
18 cze 18:42
c=pp: dzięki, świetne rozwiązanie g!
18 cze 18:44