17.6.3 strtok
Erään
mahdollisuuden tällaisen palanen kerrallaan ottamiseen tarjoaa
string.h:n funktio strtok joka toimii seuraavasti:
Ennen kutsua:
+---rivi
v
+-------------------------------------------------+
| |V|o|l|v|o| ||| | |1|2|3|0|0| ||| |1| | | | | | |
+--------------------------------------0----------+
1. Kutsu: p = strtok(rivi,"|");
+---rivi
v
+-------------------------------------------------+
| |V|o|l|v|o| | | | |1|2|3|0|0| ||| |1| | | | | | |
+--------------0-----------------------0----------+
^
+--- p
2. Kutsu: p = strtok(NULL,"|");
+---rivi
v
+-------------------------------------------------+
| |V|o|l|v|o| | | | |1|2|3|0|0| | | |1| | | | | | |
+--------------0-----------------0-----0----------+
^
p ---------+
3. Kutsu: p = strtok(NULL,"|");
+---rivi
v
+-------------------------------------------------+
| |V|o|l|v|o| | | | |1|2|3|0|0| | | |1| | | | | | |
+--------------0-----------------0-----0----------+
^
p ---------------------------+
4. Kutsu: p = strtok(NULL,"|");
+---rivi
v
+-------------------------------------------------+
| |V|o|l|v|o| | | | |1|2|3|0|0| | | |1| | | | | | |
+--------------0-----------------0-----0----------+
p ----> NULL
Näyttäisi siis siltä, että strtok sopii hyvin
tarkoituksiimme:
tiedosto\tuot_sto.c - rivin pätkiminen strtok:n avulla
int rivi_tuotteeksi(char *rivi, Tuote_tyyppi *tuote)
{
char *p;
p = strtok(rivi,"|"); if (!p) return 1;
poista_tyhjat(p); kopioi_jono(N_S(tuote- >nimike),p);
p = strtok(NULL,"|"); if (!p) return 1;
if ( sscanf(p,"%lf",&tuote- >hinta) != 1 ) return 1;
p = strtok(NULL,"|"); if (!p) return 1;
if ( sscanf(p,"%d",&tuote- >kpl) != 1 ) return 1;
return 0;
}
int tulosta_tuotteet(void)
{
...
while ( !feof(f) ) {
if ( f_lue_jono(f,N_S(rivi)) <= OLETUS ) continue;
if ( rivi_tuotteeksi(rivi,&tuote) ) continue;
printf("%- 20s %7.0lf %4d\n",tuote.nimike,tuote.hinta,tuote.kpl);
}
...
}