Newsgroup: it.comp.lang.c
Titolo: scanf per stringhe...

Ciao a tutti.
Sto tentando, da una settimana, di fare un parser per una calcolatrice.
Purtroppo sono ancora in alto mare, così ho provato a guardare su
www.programmazione.it
 dove ho trovato anche un programma di esempio in C++.
Purtroppo sto solo adesso incominciando a trattare il C... Figuratevi cosa
ci capisco di C++...!!!! (anche se sono simili).
Cmq sto provando a partire da 0 ma ho già dei problemi...
Praticamente dovrei acquisire una stringa:
char *esp;
scanf("%s",esp);
giusto?
ma se la stampo:
printf("%s",esp);
mi tronca al primo spazio!
esempio: se scrivo "Sono stupido", mi stampa "Sono".
Come faccio?
So che è una domanda stupidissima per molti di voi, ma il C mi sta facendo
impazzire!!! Alle superiori facevo Pascal: quello mi piaceva ed ero bravo...
Ma del C non capisco un tubo!!!!! Che casino...
Grazie mille
Andrea

 mi tronca al primo spazio!
Devi allocare spazio x esp con una malloc
esp = malloc( dim );
o dichiarare esp di tipo array monodimensionale di char.
char esp[SIZE];
Ivan Molella

 wrote in message
38A0701E...@tin.it...


giusto?
Si. Ma se leggi "sono stupido" te la tronca al primo spazio.
%s "fa fermare" la scanf non solo al return, ma anche al primo spazio (o
primo tab, o anche altri caratteri probabilmente).
Per leggere stringhe con lo spazio devi farti una tua procedurina.
Marco

Lo specificatore di formato %s della scanf() differisce da quello della
printf(). Mentre la printf() stampa tutta una stringa fino allo '\0', la
scanf() elimina eventuali spazi in testa, legge dei caratteri non di spazio,
termina la lettura non appena trova degli spazi. Per sapere cosa sia uno
spazio in C devi guardare la funzione isspace() dichiarata in <ctype.h> (in
pratica uno spazio e` uno fra i seguenti: ' ', '\n', '\r', '\t', '\v',
'\f'). Se vuoi leggere tutta una linea, usa la gets(). Ti consiglio di
studiare bene gli specificatori di formato della printf() e della scanf(),
che una volta compresi sono potentissimi...
/* lettura per parole */
#include <stdio.h>
int main(void)
{
    char s[80];
    while (scanf("%s", s) == 1)
        printf("|%s|\n", s);        /* le | servono per evidenziare che in s
non sono letti gli spazi */
    return 0;
}
/* lettura per linee */
#include <stdio.h>
int main(void)
{
    char s[80];
    while (gets(s) != NULL)
        puts(s);
    return 0;
}
Morale della favola: la scanf("%s", s) elimina gli spazi in testa ed in
coda.

 mi tronca al primo spazio!
Usa fgets() al posto di scanf().
EMG
PS. Questa l'abbiamo messa nelle FAQ? Mi sembra il caso...

 Per leggere stringhe con lo spazio devi farti una tua procedurina.
Potresti usare
   char buffer[80];
   ...
   scanf("%79[^\n]", buffer);
E' più semplice però usare fgets() per leggere le linee di input.
Ciao ciao,
Andrea
-- 
"...Unix, MS-DOS, and Windows NT (also known as the Good, the Bad, and 
 the Ugly)."
(by Matt Welsh)

 Come lo devo usare?
Per questo puoi vedere le FAQ in italiano di questo NG all' indirizzo:
http://digilander.iol.it/shiny77/index.htm

 E' più semplice però usare fgets() per leggere le linee di input.
Sicuramente.
EMG

 
http://digilander.iol.it/shiny77/index.htm
A proposito: a che punto stiamo? Sarà il caso di inviarle a
www.programmazione.it
?
EMG




 mi tronca al primo spazio!


 PS. Questa l'abbiamo messa nelle FAQ? Mi sembra il caso...
C'è, non ancora in forma definitiva ma arriverà presto online.
Ciao
Marco

 
www.programmazione.it
?
Non sono ancora completi gli argomenti trattati.Secondo me e' meglio
aspettare ed ampliarle con piu' argomenti.
Ivan Molella

 in modo tale da mangiarsi anche il '\n' finale.
Però se la linea in input è maggiore di 79 caratteri così te
ne perdi uno. 8)


 
www.programmazione.it
?
Direi proprio di no. Sto sistemando in maniera definitiva tutte le domande,
ma sarebbe il caso di aggiungerne altre, se vi vengono in mente. Ho paura
che inviandolo a 
www.programmazione.it
 sarebbe più difficile fare
aggiornamenti, introdurre nuove domande e risposte..
Inoltre manca ancora una parte che ritengo fondamentale: il manifesto
aggiornato. Questo aiuterebbe molto a capire cosa si dovrebbe postare e cosa
no sul gruppo. Mi sembra che la discussione sull'aggiornamento sia ad un
punto morto. Sarebbe il caso di ratificarne i risultati e sottoporre le
modifiche all'autorità competente per approvazione.
Fatemi sapere cosa ne pensate.
Ciao ciao
Marco
--
Marco Coppo
University Of Sheffield

 ne perdi uno. 8)
Pardon, mi sono ricordato che quello serviva a svuotare il buffer in
questo modo:
scanf("%*[^\n]%*c", buffer);
che č tutt'altra cosa, ovviamente.
EMG

 modifiche all'autorità competente per approvazione.
Vogliamo rivedere la proposta? Chi l'aveva redatta?
EMG

 Vogliamo rivedere la proposta? Chi l'aveva redatta?
per ora nessuno, si è creato un gran casino tra due blocchi, uno più
"purista" e uno moltoo + "lascivo" in cui sembrava che tutto andasse bene.
Il mio suggerimento è di aggiungere semplicemente nel manifesto che non si
parla di argomenti per cui esistono ng appositi, platform specific.
A presto
ciao


 }
Ok! Ma se s è un puntatore di caratteri funziona cmq?
char *s;

 wrote in message
news:8810sk$gd5$1...@lacerta.tiscalinet.it...

Se hai fortuna.
char *s non ti riserva lo spazio in memoria necessario per
salvarti la tua stringa.
Se vuoi usare char *s allora devi fare poi s = malloc(NUMERO_CARATTERI);
ciao
Stefano

 parla di argomenti per cui esistono ng appositi, platform specific.
Potrebbe anche andare bene. Sentiamo anche altri pareri...
EMG

 char *s;
Puntatore *a carattere*, non puntatore di caratteri. Si, funzionerebbe
se allocassi anche la memoria necessaria:
char *s = malloc( 80 );
EMG


Si e' vero puo' andare bene, pero' a rigore di logica in futuro sarebbe
opportuno  specificare che un post sull 'uso di funzioni dpmi x dos in mod
protetta e' OT quanto un post sull 'uso delle IPC su linux. Atualmente questo
non si evince dato che ambienti di sviluppo sotto dos sono quelli
prevalentemente usati dai developers che postano sul NG:
Ivan Molella

 prevalentemente usati dai developers che postano sul NG:
Ok. Specifichiamolo.
EMG