Newsgroup: it.comp.lang.c
Titolo: Risolvere la curiosita' sscanf!!

 }

>     sscanf (match,"model name : %s", model);
Guarda che lo spazio puntato da model lo devi allocare tu, non te lo 
alloca sscanf(). Chissa` dove va a scrivere...
E comunque %s legge fino al primo spazio (per cui al piu` ti ritorna 
"Pentium").
Per cui ti conviene sostituire quello sscanf() con una cosa del tipo:
     char * match1;
     ...
     /* Arriva fino ai due punti */
     while(*match != ':') ++match;
     /* Passa i duepunti e lo spazio */
     match1 = (match += 2);
     /* Arriva fino al newline... */
     while(*match1 != '\n') match1++;
     /* ...e lo sostituisce con un terminatore
      * cosi` in match c'e` il risultato
      * desiderato
      */
     *match1 = '\0';
     printf("%s\n",match);
     ...
-- 
   |   \    \  | ___|_  |_  | ianezz a casa sua... :-)
   |  _ \  | \ | _|    /   /  Visita il LinuxTrent a
  _|_/  _\_|  _|____|___|___| 
http://www.linuxtrent.it

 
Grazie per il codice ma il problema l'ho gia' aggirato in altro modo. 
Quello che vorrei sapere io e' come risolvere il problema usando 
"elegantemente" sscanf...
Ad esempio, non ho ben capito quando dici che mi devo allocare lo spazio 
puntato da model...ma come funziona questa sscanf allora????
Saluti confusi.
Maldoror.


Allocare spazio per "model"
NON semplicemente:
   char *model;
BENSI' (ad esempio)
   char model[32];
OPPURE
   char *model;
   ...
   model = (char *) malloc(32 * sizeof(char));
Utilizzo di sscanf
Come ti hanno gia' detto, la lettura di un token si ferma quando incontra
uno spazio. Cio' significa che ogni %s legge una sola parola.
Se sai che devi leggere due parole, allora devi scrivere
   sscanf (match,"model name : %s %s", model_A, model_B);
Ovviamente la memoria per model_A e per model_B deve essere gia' allocata
Non conosco una soluzione generale per n parole utilizzando la funzione
sscanf...
Ciao,
Ema

 
Grazie a tutti per le risposte date, ma ho scoperto che il mio problema 
e' semplicemente che l'informatica e' la scienza meno esatta che ci sia.
Infatti a casa mia (slackware 8.1) l'istruzione incriminata stampa 
"(null)" e da un mio amico invece (mandrake 9.1) stampa correttamente il 
nome del processore.
MAH...
A chi me lo spiega offriro' da bere!!
Maldoror.
ps. scusate il msg inutile!

 A chi me lo spiega offriro' da bere!!
Se tenti di accedere ad un'area di memoria non precedentemente allocata, 
il comportamento e` indefinito (se hai fortuna risulta in un crash 
subito, se hai sfortuna risulta in un crash solo quando stai facendo le 
demo agli acquirenti, o solo il terzo venerdi` del mese, etc. :-)
Peraltro, se proprio vuoi usare sscanf(), puoi andare di
     char model[255];
     ...
     sscanf(match,"model name : %254[^\n]",model);
In pratica: piazza nella memoria (allocata) puntata da "model" la 
sequenza di al piu` 254 caratteri (perche` bisogna che anche nel caso 
peggiore ci sia posto per il terminatore della stringa) che non siano il 
newline.
Notare che "model" e` un array di 255 char. Dichiarato in quel modo, 
vengono riservati automaticamente (almeno) 255 byte  pronti a ricevere 
la stringa.
Quando il nome di un array e` specificato da solo in un'espressione, e` 
equivalente all'indicazione di un puntatore al primo elemento dello stesso.


     sscanf(match,"model name : %254[^\n]",model);
Oh adesso ho capito e funziona anche da me!!
Ti dovro' spedire una bottiglia di sangiovese :)
Grazie,
Maldoror.