funkcia "strtok" v Cecku

Programovacie jazyky, rady, poradňa...
cheeseburger
Light Star
Light Star
Príspevky: 235
Registrovaný: 21 máj 2013, 18:49

funkcia "strtok" v Cecku

Príspevok od používateľa cheeseburger »

Ahojte, chcem pouzit funkciu strtok na parsovanie stringu, no nerozumiem jednej veci. Pouzijem priklad z tejto stranky http://www.tutorialspoint.com/c_standar ... strtok.htm

Kód: Vybrať všetko

int main()
{
   char str[80] = "This is - www.tutorialspoint.com - website";
   const char s[2] = "-";
   char *token;
   
   /* get the first token */
   token = strtok(str, s);
Toto mi je viacmenej jasne, poslem tam string a hlada "-", ak najde pred nou to cutne.

Kód: Vybrať všetko

  /* walk through other tokens */
   while( token != NULL ) 
   {
      printf( " %s\n", token );
    
      token = strtok(NULL, s);
   }
   
   return(0);
}
Tu vsak uz nerozumiem, preco tam posiela NULL a napriek tomu ta funkcia vie, ze ma hladat v tom poli charov str? Vie mi to niekto vysvetlit? Dakujem pekne.
BX
Addict
Addict
Používateľov profilový obrázok
Príspevky: 4572
Registrovaný: 10 jan 2008, 15:30

Re: funkcia "strtok" v Cecku

Príspevok od používateľa BX »

Pozri sa do dokumentácie http://www.cplusplus.com/reference/cstring/strtok/
Tam je jasne napísané, narozdiel od toho tutoriálu, že
Alternativelly, a null pointer may be specified, in which case the function continues scanning where a previous successful call to the function ended.
Takže ak niečomu nerozumieš, vždy najprv pozri do dokumentácie ;)
(nie je to úplne oficiálna dokumentácia, takže inak povedané, vždy nahoď meno funkcie do googla a otvor pár prvých stránok)
cheeseburger
Light Star
Light Star
Príspevky: 235
Registrovaný: 21 máj 2013, 18:49

Re: funkcia "strtok" v Cecku

Príspevok od používateľa cheeseburger »

Super, dakujem velmi pekne, hned to dava zmysel.

Chcel by som sa vsak este spytat trocha mimo temu, mam funkciu

Kód: Vybrať všetko

void foo(char* meno, char* hodnota)
viem spravit nejak switch do ktoreho hodim to meno a potom case budu jednotlive mena? Mam s tym trochu problem, nakolko to nie je len jeden znak. Alebo premyslat nad nejakym alternativnym riesenim?
BX
Addict
Addict
Používateľov profilový obrázok
Príspevky: 4572
Registrovaný: 10 jan 2008, 15:30

Re: funkcia "strtok" v Cecku

Príspevok od používateľa BX »

Nepochopil som, ale zdá sa, že chceš len obyčajný cyklus?
Trochu to rozveď.
cheeseburger
Light Star
Light Star
Príspevky: 235
Registrovaný: 21 máj 2013, 18:49

Re: funkcia "strtok" v Cecku

Príspevok od používateľa cheeseburger »

no do tej funkcie foo mi v "meno" moze prist napr LED, BUTTON atd. Na zaklade toho co pride, chcem spravit nejaku akciu. Preto som rozmyslal, ze na to vyuzijem switch. Lenze nieco ako toto nefunguje.

Kód: Vybrať všetko

switch(meno){
        case "LED" :
        ..................
}
je mi jasne, ze porovnavam jablka s hruskami, no zaujimalo by ma, ci to viem nejak pekne vyriesit.
BX
Addict
Addict
Používateľov profilový obrázok
Príspevky: 4572
Registrovaný: 10 jan 2008, 15:30

Re: funkcia "strtok" v Cecku

Príspevok od používateľa BX »

V C-čku na toto veru switch nefunguje. Ten nevie porovnávať stringy. Musíš holt pre každú akciu urobiť podmienku a porovnávať to cez funkciu strcmp.
Fabo
Hardcore addict
Hardcore addict
Používateľov profilový obrázok
Príspevky: 6810
Registrovaný: 16 nov 2007, 17:23
Bydlisko: 's Chravenhache
Kontaktovať používateľa:

Re: funkcia "strtok" v Cecku

Príspevok od používateľa Fabo »

..preco to robis v cistom C?
aacid
Hardcore addict
Hardcore addict
Príspevky: 8135
Registrovaný: 22 nov 2006, 21:55
Bydlisko: BA

Re: funkcia "strtok" v Cecku

Príspevok od používateľa aacid »

v c-cku je veta len pole znakov, nic viac. dnes ma kazdy rozumnejsi jazyk implementovany string, co je tiez vlastne len pole znakov ale da sa normalne pracovat, teda porovnavat, spajat, rozdelovat, rozrezavat.

pokial nie si obmedzeny zadanim, ze musis robit v cistom C, tak to rozsir aspon na c++, tam mas triedu string, s ktorou by ti mal fungovat aj switch.
BX
Addict
Addict
Používateľov profilový obrázok
Príspevky: 4572
Registrovaný: 10 jan 2008, 15:30

Re: funkcia "strtok" v Cecku

Príspevok od používateľa BX »

Nie nebude, switch v C aj C++ vie porovnávať len čísla.
aacid
Hardcore addict
Hardcore addict
Príspevky: 8135
Registrovaný: 22 nov 2006, 21:55
Bydlisko: BA

Re: funkcia "strtok" v Cecku

Príspevok od používateľa aacid »

ok, tak potom jedine prejst na este vyssi jazyk :D
alebo ifelse...
cheeseburger
Light Star
Light Star
Príspevky: 235
Registrovaný: 21 máj 2013, 18:49

Re: funkcia "strtok" v Cecku

Príspevok od používateľa cheeseburger »

Dakujem za radu BX :)
Fabo napísal:..preco to robis v cistom C?
Arduino ;)

A este jeden dotaz :D

volam funkciu

Kód: Vybrať všetko

writeData("LED",1);
a funkcia writeData

Kód: Vybrať všetko

void writeData(char* name, int value){
...
}
pri kompilovani mi hadze tento warning, kazdopadne program funguje to tak ako ma
warning: deprecated conversion from string constant to 'char*' [-Wwrite-strings]

Viem to nejak vyriesit? Dakujem :)
BX
Addict
Addict
Používateľov profilový obrázok
Príspevky: 4572
Registrovaný: 10 jan 2008, 15:30

Re: funkcia "strtok" v Cecku

Príspevok od používateľa BX »

Stačí dať ako parameter const char* miesto char*, pretože tam posielaš konštantný string.
ado130
Expert
Expert
Používateľov profilový obrázok
Príspevky: 163
Registrovaný: 01 aug 2012, 12:36

Re: funkcia "strtok" v Cecku

Príspevok od používateľa ado130 »

Prípadne môžeš použiť switch, ale miesto case "LED" bude len case 'L', ďalšie napr. case 'B' (Button), ... Takže ak máš meno ako pole znakov, dáš do switch(meno[0]).
aacid
Hardcore addict
Hardcore addict
Príspevky: 8135
Registrovaný: 22 nov 2006, 21:55
Bydlisko: BA

Re: funkcia "strtok" v Cecku

Príspevok od používateľa aacid »

alebo enum pouzit?
Napísať odpoveď