Nef.ID napisał(a):
"wyraz1 wyraz2 wyraz3 wyraz4"
To jest Literał

ale przy takim zapisie jest on przez AVR GCC umieszczony w pamięci RAM, a tak naprawdę to i w pamięci FLASH (która jest tu zmarnowana) bo we flash jest tylko po to żeby przed startem main, został skopiowany do RAM w jednej z sekcji inicjalizacyjnych. A jak już jest w RAM to zachowuje się normalnie jak każda inna zmienna tablicowa tego typu i dlatego możesz na niej wykonywać operacje. W tym wypadku korzystasz z funkcjonalności C, gdzie zapis "xxxxx" jest literałem w RAM ale jednocześnie zapis ten zwraca wskaźnik do tej tablicy, dokładniej mówiąc do pierwszego elementu tej tablicy.
to jest mniej więcej dokładnie tak jakbyś napisał w zmiennych globalnych
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
a później w kodzie
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
tyle że tu masz jawną nazwę tablicy

a w twoim wypadku funkcja strtok dostaje ją niejawnie, czyli od razu adres do pierwszego elementu.
A skoro tak...
Nef.ID napisał(a):
Nie rozumiem tego, że przecież jak wchodzę do funkcji show_sms_test(..), to ponieważ jest tam wsk= strtok_mk( "wyraz1 wyraz2 wyraz3 wyraz4", " " ) ciągle ten cały tekst
i mimo, że ciągle go niszczę przez szukanie tokenów, to powinienem jednak dostawać wyraz1, wyraz2 itd.
a co ty niszczysz ? Być może nie do końca wiesz jak się posługiwać funkcją strtok()
normalnie gdybyś zrobił to z tablicą jak pokazałem wyżej to w pierwszym wywołaniu funkcji musiałbyś zapisać to tak:
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
ale każde NASTĘPNE wywołanie trzeba robić TAK:
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
żeby parsować kolejne wyrazy poprawnie - widzisz różnicę ?
Cytuj:
wsk= strtok( NULL, " " );
czyli musiałoby być tak:
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
Ty zaś za każdym razem ją wywołujesz tak:
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
czyli tak jakbyś wciąż wywoływał ją tak:
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
a w tym wypadku - wciąż będziesz miał wsk = na pierwszy wyraz tej tablicy. I to działa w pełni poprawnie

Pamiętaj, że strtok() nie NISZCZY stringa w tym sensie, że jakoś kasuje z niego dane. Jedyne co robi to wstawia ZERO w miejsce gdzie zobaczy pierwszy token. To dzięki temu jak zrobisz sobie później np
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
to wyświetli ci na terminalu tylko pierwszy wyraz - bo jest to tablica "wyraz1" zakończona zerem

Dlatego do swojego ćwiczenia użyj jak się należy wcześniej zdefiniowanej tablicy np:
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
zamiast literału