Recent Changes - Search:

Oktatás

* Programozás 1
  + feladatsor
  + GitHub oldal

* Szkriptnyelvek
  + feladatsor
  + quick link

Teaching

* Programming 1 (BI)
  ◇ exercises
  ◇ quick link

* Scripting Languages
  ◇ exercises
  ◇ quick link

teaching assets


Félévek

* aktuális (2023/24/2)
* archívum


Linkek

* kalendárium
   - munkaszüneti napok '20
* tételsorok
* jegyzetek
* szakdolgozat / PhD
* ösztöndíjak
* certificates
* C lang.
* C++
* C#
* Clojure
* D lang.
* Java
* Nim
* Scala


[ edit | logout ]
[ sandbox | passwd ]

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ó tudni

A 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 " " (szóköz) mentén tokenizálni.

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. " - ", akkor ez azt jelenti, hogy a szeparátorjel vagy szóköz, vagy mínuszjel! Azaz a szeparátor nem a " - " három hosszúságú sztring lesz!

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 strtok a köv. hívás során NULL-lal tér vissza.

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'
Cloud City

  

Blogjaim, hobbi projektjeim

* The Ubuntu Incident
* Python Adventures
* @GitHub
* heroku
* extra
* haladó Python
* YouTube listák


Debrecen | la France


[ edit ]

Edit - History - Print *** Report - Recent Changes - Search
Page last modified on 2015 May 10, 19:58