Newsgroup: it.comp.lang.c
Titolo: sscanf

Salve, ho un problemino con sscanf.
Ho una stringa creata con sprintf che contiene stringhe e interi...
Quando la voglio decodificare con sscanf ho difficoltà nell'estrarre
stringhe che contengono spazi perchè sccanf identifica lo spazio come
carrattere terminale. Ho capito che posso usare invece di %s [], ma cosa
devo scrivere dentro le parentesi quadre?
Non so se mi sono spiegato bene, provo a fare un esempio
...
...
sscanf(stringa,"%s %d %s",&stringa[0],%intero,&stringaconspazi[0]);
...
...
Grazie Seva


Personalmente penso che ti sia piu' utile usare la strtok(), e come 
token ricerchi uno spazio vuoto.
Poi se hai bisogno di trasformare la stringa letta in un intero c'e' atoi().
buon lavoro!
caligari.

caligari wrote:

Non mi sono spiegato bene...forse è meglio un esempio concreto.
        ...
        ...
        sprintf(stringa,"%s %d %s","ciao",1,"ciao mamma");
        ...
        ...
        sscanf(stringa,"%s %d %s",&str[0],&uno,&str_sp[0]);
        /* A questo punto sia str che str_sp contengono "ciao" perchè sscanf si è 
fermata al primo spazio incontrato */
Come posso fare per estrarre la stringa completa "ciao mamma"?
Seva

puoi aggirare il problema utilizzando le funzioni di libreria string.h, ad
esempio append(), che attacca due stringhe..
estrai le due stringhe che ti servono e le attacchi...
io farei cosě..
Carlo

 esempio append(), che attacca due stringhe..
nella mia ignoranza la append() non l'ho mai sentita.
Forse e' meglio la piu' standard strcat().
ciao,
g.

ehm.. append è una funzione del lisp...
sorry..
Carlo

carlo wrote:

Non posso usare strcat(non append()...) perchč non so a priori se la stringa
da estrarre contenga degli spazi.
Ho bisogno di una sorta di regular expression...ho provato ad usare la
libreria pcre, ma non ci ho capito molto.
Seva

 Seva
Mi sembra che usare le espressioni regolari sia eccessivo.
Mi sembra che il fulcro di tutto il problema sia:
se la stringa che voglio scandire contiene spazi, come
decido la fine della stringa ?
Faccio un esempio.
Se il tuo input e' composto da 2 stringhe (quindi vuoi leggere diciamo
char A[80],B[80]; )
dove A e B possono contenere spazi, allora
se l'input e' "foo bar pippo" ecco che sei gia' del gatto:
come fai a decidere se A="foo bar" e B="pippo" oppure se A="foo" e 
B="bar pippo" ?
un altro discorso e' se puoi prevedere dei "delimitatori" impliciti
o espliciti nel tuo input.
Per esempio un delimitatore esplicito puo' essere un carattere non 
usato, diciamo #
allora se l'input e'  "foo bar # pippo" tu sai come spezzare A e B.
Un delimitatore implicito puo' derivare dalla conoscenza, ad esempio,
che vuoi leggere una stringa A poi un numero N e poi una stringa B e che 
A e B non contengono numeri. In questo caso un qualunque numero fa da 
delimitatore.
In ogni caso (i due casi sopra) io prevederei di non usare la scanf,
ma di farmi una piccola (veramente piccola) routine che quando gli
passo l'input di un certo formato me lo divide come mi aspetto.
E' veramente facile. Basta che aggeggi un po' con strchr(), atoi(), 
strsep(), strspn(), atoi(), etc.etc. ed eventualmente con strtok().
ciao,
g.
Cioe'


Non avevo mai sentito parlare di questa possibilita'...
Sono andato a vedere lo help del compilatore....e l'ho trovata !
( come dici tu, bisogna usare  [] , grazie dell'info ! )
Non so se e' standard o no, sul Borland 5.5 c'e'...
Devi mettere la coppia di quadre e all'interno tutti i
caratteri che possono comporre la stringa,
vanno bene anche i range con il meno.
L'esempio sotto funziona.
#include <stdio.h>
int main(void)
{ char *s="ciao mamma ciao papa";
  char b[80];
  sscanf(s,"%[a-z A-Z]s",b);
  printf("<%s>\n",b);
  return 0; }
Ciao
E.
p.s.
Spero che qualche esperto ci dica se fa
parte dello standard o no.....

 parte dello standard o no.....
Grazie mille...ho risolto il problema!
Seva