Newsgroup: it.comp.lang.c
Titolo: problema con sscanf!

Salve,
questa e' una funzione che ho scritto per estrarre il modello del mio 
processore dal file /proc/cpuinfo:
int cpuinfo (void){
	int fp,n;
	char buf[1024];
	char *match, *model;
	fp=open("/proc/cpuinfo",O_RDONLY);
	if (fp==-1){
		perror("cpuinfo");
		close(fp);
		exit(1);
	}
	n=read(fp,buf,sizeof(buf));
	buf[n]='\0';
	match=strstr(buf,"model name");
	if (match==NULL)
		exit(1);
	sscanf (match, "model name : %s",model);
	printf ("%s\n",model);
}
La funzione mi stampa solo la stringa Pentium...mentre nel mio file 
/proc/cpuinfo alla voce "model name" c'e' scritto Pentium III 
(Coppermine)...dove sbaglio??
Grazie,
Maldoror.

 (Coppermine)...dove sbaglio??
Gaurda la man page, all'opzione %s cosa dice:
 s      Matches  a  sequence of non-white-space characters;
        the next pointer must be a pointer to char, and the
        array  must  be  large  enough  to  accept  all the
        sequence and the terminating  NUL  character.   The
        input string stops at white space or at the maximum
        field width, whichever occurs first.
Hai 2 modi di procedere per leggere le informazioni che ti servono:
- a mano: una fgets per ottenere la linea, intercetti la parte di frase che 
  ti interessa ("model name: "), ti posizioni al primo carattere che non sia 
  un blank successivo e stampi tutto fino a fine linea (ricorda che nel 
  buffer c'e' una newline dalla lettura precedente... regolati di 
  conseguenza)
- usi un'espressione regolare. Non e' standard, ma molti compilatori ti 
  forniscono qualcosa... in particolare visto che lavori sotto Linux, sono 
  sicuro che le hai a disposizione: man regcomp e segui le altre man page 
  collegate
-- 
Mox
"Trust the programmer."
"Don't prevent the programmer from doing what needs to be done."
"Keep the language small and simple."
"Provide only one way to do an operation."

 
Grazie per la risposta, ma ora l'output della funzione e' un bellissimo 
"(null)"...
e la funzione e' sempre la stessa!! :( ARgh!!!
Ma non si possono usare espressioni regolari all'interno di sscanf?
E poi leggo dalla man page di fgets che ha bisogno di un FILE* come 
paramentro, cosa che non ho, dato che devo usare la system call open...
Insomma, sono al punto di prima!
Maldoror.

	sscanf (match, "model name : %s",model);
   Se questo e` l'effettivo codice che usi, model punta a caso, e
sscanf va a scrivere dove capita.
   Comunque prova "%[^\n]", al posto di "%s".
-- 
S.L.


Niente, con le seguenti instruzioni:
sscanf (match, "model name : %[^\n]", model)
printf ("%s",model);
mi stampa (null)...sto impazzendo!!
Maldoror.

mi stampa (null)...sto impazzendo!!
   model adesso punta a un buffer correttamente allocato?
-- 
S.L.


Ti incollo la mia funzione cpu():
  int cpu (void){
  	int fp,n;
  	float clock;
  	char buf[1024];
  	char *match, *model;
  	fp=open("/proc/cpuinfo",O_RDONLY);
  	if (fp==-1){
  		perror("cpuinfo");
  		close(fp);
  		exit(1);
  	}
  	n=read(fp,buf,sizeof(buf));
  	close(fp);
  	buf[n]='\0';
  	match=strstr(buf,"model name");
  	if (match==NULL)
  		exit(1);
  	sscanf (match, "%s", model);
  	printf ("%s\n",model);
  	return 0;
  }
Non riesco a capire perche' mi stampi (null)!!! :(
Maldoror.

Maldoror wrote:
Scusa, questa e' quella corretta:
 >  int cpu (void){
 >
 >      int fp,n;
 >      char buf[1024];
 >      char *match, *model;
 >
 >      fp=open("/proc/cpuinfo",O_RDONLY);
 >      if (fp==-1){
 >          perror("cpuinfo");
 >          close(fp);
 >          exit(1);
 >      }
 >      n=read(fp,buf,sizeof(buf));
 >      close(fp);
 >      buf[n]='\0';
 >      match=strstr(buf,"model name");
 >      if (match==NULL)
 >          exit(1);
 >      sscanf (match, "model name : %s", model);
 >      printf ("%s\n",model);
 >      return 0;
 >  }
Maldoror.