Newsgroup: it.comp.lang.c
Titolo: leggere una stringa immessa dall'utente

Salve a tutti!
E' da poco che programmo in C (ma per fortuna so programmare già in altri
linguaggi), e mi stavo chiedendo quale fosse il metodo migliore per leggere
una stringa immessa da un utente...
Qualcuno potrebbe darmi qualche suggerimento?
Grazie a tutti!


Questo è uno dei metodi a mio parere più semplice ma, se un utente digita
una striga che supera i 100 caratteri??
In questo casto basta dichiarare un puntatore char* e allocargli della
memoria.... Quindi a secondo dei casi ... Non esiste un metodo più
efficiente... (almeno a mio parere).
ciao

 ha scritto nel messaggio
news:SS6Za.234505$Ny5.7...@twister2.libero.it...


Ciao!
Mi č venuto un dubbio...
lo scanf, nel tuo esempio era cosě:
scanf ("%s", &nome);
ossia, puntavi all'indirizzo della variabile nome.
Perň ho notato che se uso quest'altra sintassi, il risultato non cambia...
scanf ("%s", nome);
come mai?
Grazie ancora

 ha scritto nel messaggio
news:SS6Za.234505$Ny5.7...@twister2.libero.it...


 ha scritto nel messaggio
news:T77Za.34592$an6.1...@news1.tin.it...

perche' normalmente tutti gli array vengono cmq passati alle funzioni come
puntatori e non come copia temporanea ... quindi funziona cmq in tutti e due
i modi ... ma e' meglio che impari ad usare & perche' se poi devi leggere
dati base (int ecc) e non array fai dei macelli passandoli senza & (dovrebbe
darti errore il compilatore se non mi sbaglio ... ma non ne son sicuro)
ciao

 Grazie per la pazienza! :)
quale scanf successivo ??? dici il getc ???
ti stampava anche solo fino al carattere prima della , ???
cmq scanf legge l'input fino al primo spazio o al primo acapo, non so se
nella tua libreria hanno messo anche le ',' come delimitatore di fine
stringa ...
ciao

 Grazie per la pazienza! :)
Non ho ben capito la domanda :-)... Potresti riformularma in modo piu
esauriente e correttooo? grazieeeeeeee ;-)
ciauz


 memoria....
???? no.. occhio... quando leggi qualcosa devi averne ben chiare le
dimensioni massime **PRIMA**

un modo migliore per leggere una stringa č meglio usare fgets() al posto
della scanf
fgets(char *stringa, int n, FILE *)
esempio:
fgets(string,100,stdin);
in questo modo leggi dallo standard input fino a 100 caratteri o fino a fine
riga
(in questo modo sei sicuro di non superare i 100 caratteri che hai allocato
nel tuo array string)
 la fgets termina solo in caso di fine riga o in caso legga N caratteri, non
termina per gli spazi
cyao
Fra

> In effetti può essere una validissima alternativa....
conviene usare sempre fgets, con una scanf corri il rischio che l'utente
immetta una stringa piu' lunga della dimensione assegnatagli e questo
porterebbe dei comportamenti anomali o degli errori nel programma

 digita una striga che supera i 100 caratteri??
Ti ho risposto sopra.
Ciao.
-- 
Per l'e-mail rimuovere la frase in maiuscolo e gli underscore.

"FRaNCeSCo" <?@?.?> ha scritto nel messaggio
news:Rn9Za.34937$an6.1...@news1.tin.it...

e dove lo mettiamo il carattere \0 visto che fgets restituisce un array di
char non terminato e non una stringa terminata ???
dovrebbe leggere fino a 99 e poi aggiungere in fondo lo \0
ciao

 scanf("%100s", string);
Non lo sapevo sto fatto... potresti spiegarmi meglio grazie ... ciao

 Non lo sapevo sto fatto... potresti spiegarmi meglio grazie ... ciao
Per limitare il numero di byte letti, è sufficiente scrivere il 
numero massimo di bytes che si vuole ottenere tra il '%' e la 's'.
Nel nostro caso, ho preso una svista, poiché dovevo scrivere 99 
invece di 100.
All clear?
Ciao



la stringa è di 100 char. quindi 100 * 1Byte = 100 byte
Perchè 99 e non 100?
Ciao
Grazie

 Perchè 99 e non 100?
Perché se vengono letti 100 caratteri, il terminatore scanf lo 
scriverà fuori dall'array `string', dove potrebbe non esserci nulla 
(e con un pò di fortuna si rimane ancora nello stack del programma), 
oppure dei dati o del codice del programma (e qui sono cavolazzi), o 
della roba di un altro prg (e qui so' coliche renali).
Ok?


 della roba di un altro prg (e qui so' coliche renali).
Ah già mi ero dimenticato del terminatore... grazie ;-)

 char non terminato e non una stringa terminata ???
sicuro ?
cya'
Fra

"FRaNCeSCo" <?@?.?> ha scritto nel messaggio
news:FVeZa.35549$an6.1...@news1.tin.it...

sicuro e' morto :-p
dal template pareva un array di char non terminato ...
ciao

 char non terminato e non una stringa terminata ???
Falso.

 fgets(string,100,stdin);
Io ero convinto che queste funzioni fossero disponibili solo per lo stream
su file, invece inserendo "stdin", come terzo argomento posso leggere dallo
stram di input come se fosse un file...GENIALE!!! :D
Veramente un grazie a tutti quanti! :D
     *___*___*
--- RAPPERZ ---
     *      *      *

sicuro sara' ache morto ma l'ANSI è ANSI...
:D
cyao

dovrebbe leggere fino a 99 e poi aggiungere in fondo lo \0
direttamente dalle pagine man:
       fgets()  reads  in  at  most one less than size characters
       from stream and stores them into the buffer pointed to  by
       s.  Reading stops after an EOF or a newline.  If a newline
       is read, it is stored into the buffer.  A '\0'  is  stored
       after the last character in the buffer.

> }
Il codice che io avrei usato e':
#include<stdio.h>
int main()
{
	char stringa[100];
	fputs("Inserisci una stringa\n ",stdout);
        fgets(stringa,100,stdin);
	fputs("\nLa stringa inserita e':\n",stdout);
	fputs(stringa,stdout);	
	/* eventuale inserimento di fflush(stdin) nel caso si input
 	   successivi */
}
Vorrei sapere eventuali pericole ed insidie del codice che ho proposto.

  	   successivi */
Qui casca l'asino: l'uso di fflush() su uno stream in lettura non e' 
definito dallo standard => comportamento imprevedibile => non lo fare. 
fflush() si usa solo su uno stream in scrittura.
Inoltre manca un return 0;


 stram di input come se fosse un file...GENIALE!!! :D
bhe soprattutto perche' stdin, stdout e stderr sono 3 file standard che
bindano lo standard input, output ed error.
(poi puoi reindirizzare a piacere tali file cmq)
quindi direi che non e' geniale ma e' standard :-p
ciao

 ha scritto nel messaggio
news:58ncjv8uq9nhonkd6...@4ax.com...

capito che ho cannato e mi son fatto traviare dalla definizione della
funzione con il char* ... :-/ (pensando fosse solo un array di char)
cmq bisogna cmq definire il buffer di 101 char per leggerne 100 no ???
(questo spero di averlo capito bene)
per il resto io il man non lo ho sul mingw anche se ho i file di manpage
all'interno ... :-/ sai come poter usare il man con il mingw ???
ciao

 (questo spero di averlo capito bene)
Si'. In questo modo puoi leggere 100 char (compreso eventualmente il 
newline).

> }
Qundi non devo assolutamente usare fflush() :), e con cio' mi spiego un
problema che stavo affrontanto poco fa.
Ma se non uso fflush() ho problemi se la stringa inserita supera la
dimensione d'array di memorizzazione? cmq ora faccio un paio di test per
padroneggiare meglio la situazione
GRAZIE

 dimensione d'array di memorizzazione?
No. Semplicemente, se la stringa e' piu' lunga del buffer, fgets() 
leggera' finche' ci sta. La parte mancante sara' letta da un'eventuale 
successiva chiamata a fgets() (o altra funzione di input).

newline).
Ti consiglio di definire un array di n+2 elementi se vuoi leggere
dalla fgets stringhe lunghe massimo n elementi.
Cosě avrai sempre spazio per memorizzare sia il possibile ritorno a
capo, sia il terminatore. Altrimenti con input di precisamente 100
caratteri il ritorno a capo viene perso.

 caratteri il ritorno a capo viene perso.
Non viene perso, semplicemente viene letto dalla prossima chiamata ad 
una funzione di input.