Oktatás * Programozás 2 * Szkriptnyelvek * levelezősök Félévek Linkek * kalendárium |
C /
tokenizálás
#include <stdio.h> #include <string.h> int main() { char sor[] = "jabba:x:1000:100:Jabba Laci:/home/jabba:/bin/bash"; char *p; p = strtok(sor, ":"); // sor szétvagdosása a ":" jel mentén while (p != NULL) // amíg vannak darabok { printf("%s\n", p); // p az aktuális sztringdarabra mutat p = strtok(NULL, ":"); // onnan folytatja, ahol az előző strtok hívás abbahagyta } return 0; } Kimenet: jabba x 1000 100 Jabba Laci /home/jabba /bin/bash Jó tudniA sztring elején és végén lévő szeparátor karaktereket átugorja! Ha egy szeparátor karakter egymás után többször szerepel, egynek veszi őket. Példa: char sor[] = ":::::aa::::bb:::::cc::::::dd::::::::"; // Futtassuk le erre a fenti programot, azaz a ":" mentén vagdossuk fel. Kimenet: aa bb cc dd Következmény: ha szavak szóközökkel (egy vagy több szóközzel) vannak elválasztva, s a szavakat akarjuk kiszedni, akkor elegendő a Még egy példa#include <stdio.h> #include <stdlib.h> #include <string.h> int main() { char sor[] = "{12}{15}szöveg"; char *p; p = strtok(sor, "{"); // a "{" jelet az elején átugorja printf("'%s'\n", p); // "12}" printf("%d\n", atoi(p)); // a szám utáni sallangot ignorálja puts("----------"); p = strtok(NULL, "}"); // "15" printf("'%s'\n", p); printf("%d\n", atoi(p)); puts("----------"); p = strtok(NULL, ""); // vedd a részsztringet a végéig printf("'%s'\n", p); return 0; } Kimenet: '12}' 12 ---------- '15' 15 ---------- 'szöveg' Mi a helyzet, ha több szeparátorjelet is megadunk?Az strtok 2. paramétere egy szeparátorjeleket tartalmazó halmaz. Vagyis ha a 2. paraméter pl. Mit fog egy tokennek venni? Elindul a mintasztring elejétől, s keres egy olyan karaktert, ami nem szeparátorjel. A token itt fog kezdődni. Ez az első szeparátorig (exkluzív, nem lesz része a tokennek) fog tartani (vagy a sztring végéig, ha nincs benne szeparátorjel). Hol kezdődik a következő token? Megint csak lépked a következő olyan karakterig, ami nem szeparátorjel. Stb. Vagyis ha egymás után több szeparátorjel szerepel, akkor ezeket átlépi, s keres egy olyan karaktert, ami nem szeparátorjel. Példa #1: #include <stdio.h> #include <string.h> int main () { char str[] =" Falcon,eagle-hawk..;buzzard,gull..pigeon sparrow,hen;owl.Toad"; char * pch=strtok(str," ;,.-"); while (pch != NULL) { printf ("%s\n",pch); pch = strtok (NULL, " ;,.-"); } return 0; } Kimenet: Falcon eagle hawk buzzard gull pigeon sparrow hen owl Toad Az első karakter szóköz, de ez szeparátorjel, így átlépi. A 'F' nem szeparátor, így az első token itt kezdődik. Megy tovább, s keresi a köv. szeparátorjelet, ez a vessző lesz. Mivel a szeparátor nem lesz része a tokennek, az első token a "Falcon" lesz. Ugorjunk, s nézzük a "hawk" tokent. Utána pont szerepel, ami szepatátor, átlépi. Megint egy pont jön, átlépi. A pontosvesszőt is átlépi. A 'b' nem szeparátor, itt fog tehát kezdődni a köv. token. Stb. Ugorjunk a végére, megvolt az "owl" token, s átlépjük a pontot. A 'T' egy token kezdete lesz. Lépegetünk tovább, s elérjük a sztring végét: ez lesz a token vége. Az Példa #2: Nézzük meg egy korábbi példa javított változatát: #include <stdio.h> #include <stdlib.h> #include <string.h> int main() { char sor[] = "{12}{15}szöveg"; char *p; p = strtok(sor, "{}"); // a "{" jelet az elején átugorja printf("'%s'\n", p); // "12" printf("%d\n", atoi(p)); puts("----------"); p = strtok(NULL, "{}"); // "15" printf("'%s'\n", p); printf("%d\n", atoi(p)); puts("----------"); p = strtok(NULL, ""); // vedd a részsztringet a végéig printf("'%s'\n", p); return 0; } Kimenet: '12' 12 ---------- '15' 15 ---------- 'szöveg' |
Blogjaim, hobbi projektjeim * The Ubuntu Incident [ edit ] |