previous next Up Title Contents Index

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);
	  }
	...
	}


previous next Up Title Contents Index