PDA

Visualizza la versione completa : Acquisire stringhe da tastiera


dados881
30-08-2006, 12:45
ciao, io dovrei fare un programma dove acquisire da tastiera un testo, tipo:

char *testo;
testo = (char*)malloc(sizeof(char));
printf("inserire testo");
scanf("%s", *testo);

ho usato un puntatore a carattere perche non si sa il testo immesso dall'utente quanto possa essere lungo, puo esserlo 10, 100, 1000.

il problema sta nel fatto che tramite la scanf riesco ad acquisire soltanto quello che e stato digitato fino allo spazio, ad es. se l'utente immette "ciao a tutti", il testo acquisisce soltanto "ciao". :dh:

mi e stata consigliata la funzione :confused:

ssize_t getline(char **buffer, size_t *n, FILE *stream)

qualcuno saprebbe spiegarmela un po per favore?
e piu precisamente:
size_t *n va inserita la lunghezza dell'input, ma se non la conosco che inserisco?
FILE *stream legge da file, ma io devo leggere da tastiera

come dovrei fare? :messner:
grazie mille!!!!

I'mtheleader
30-08-2006, 12:57
Allora..
Prima di tutto nella malloc sarebbe corretto passargli la grandezza giusta che deve assumere la stringa..
La malloc una funzione particolare che permette di riservare dello spazio di memoria per una varioabile o come in questo caso per una stringa.. Per naturtalmente la malloc deve sapere quanto spazio riservare ed per questo che sizeof(char) non basta perche cosi riserveresti posto per un solo carattere e non una stringa..
Quindi la cosa migliuore sarebbe fare sizeof(char)*100 dove 100 il numero di posti che ho riservato in memoria per la stringa..
Per quanto riguarda l'acquisizione di una stringa con spazi compresi, puoi usare la funzione gets(stringa).
Questa funzione ti acquisisce una stringa.. al posto di stringa metti la tua stringa.. senza *..

P.s.

La scanf come secondo argomento prende la variabile da riempire.. ma vuole sapere l'indirizzo .. ed per questo che non devi passare la variabile con l'* ma la devi passare senza..

Dimmi se ti funziona..

ciao ciao

XWolverineX
30-08-2006, 13:05
L'input e output in C nella stdlib funziona tramite gli stream.
I file si aprono con gli stream


FILE *file = fopen(...)


Ma anche il video e la tastiera sono degli stream,forse non te ne eri mai accorto
per la tastiera si chiama stdout e il video stdin.
Quindi quando ti chiede file, scrivici stdin.

dados881
30-08-2006, 13:06
grazie mille, l'ho provata e funziona :ciauz:

solo che in fase di compilazione mi da il messaggio:
warning: the 'gets' function is dangerous and should not be used. :oVVoVe:

che significa?

XWolverineX
30-08-2006, 13:21
La funzione pericolosa e non dovrebbe essere usata.
E' una funzione di livello molto basso e perci ti avverte. Che compilatore usi?

Samuele_70
30-08-2006, 13:24
Originariamente inviato da XWolverineX
[...]
per la tastiera si chiama stdout e il video stdin.
[...]
Hem...
per la tastiera si chiama stdin e il video stdout.


Originariamente inviato da dados881
grazie mille, l'ho provata e funziona

solo che in fase di compilazione mi da il messaggio:
warning: the 'gets' function is dangerous and should not be used.

che significa?

Il compilatore ti avvisa che la gets una funzione deprecated, in quanto
vulnerabile al 'buffer overflow'.
Come alternativa meglio utilizzare la fgets().
prototipo : char *fgets(char *s, int n, FILE *stream);
Es :


char buf[202]
fgets( buf, 200, stdin);

XWolverineX
30-08-2006, 15:05
Ops avevo sbagliato!

dados881
30-08-2006, 17:05
ok, la fgets e perfetta, grazie...
l'unica cosa pero e che comunque devo mettere la grandezza, es:

fgets(buf, 200, stdin) e se viene inserito un testo maggiore di 200?
sono obbligato a mettere a priori la grandezza o posso fare in altro modo???

grazie!!!!

Samuele_70
30-08-2006, 18:22
Originariamente inviato da dados881
ok, la fgets e perfetta, grazie...
l'unica cosa pero e che comunque devo mettere la grandezza, es:

fgets(buf, 200, stdin) e se viene inserito un testo maggiore di 200?
[...]
I caratteri in pi restano nel 'buffer di input', quindi farai bene anche a mettere dopo ogni
fgets() anche una 'fflush(stdin)' che rimuova questi eventuali caratteri 'in avanzo'.
Un' altra cosa, avrai notato che la fgets() lascia alla fine della stringa, prima del terminatore '\0',
un valore 13 (il tasto invio) per rimuoverlo (se vuoi) puoi fare cos :


buf[strlen(buf)-1]='\0';


[...]
sono obbligato a mettere a priori la grandezza o posso fare in altro modo???

grazie!!!!
Si a meno che tu non decida di abbandonare la dichiarazione 'statica' delle stringhe e
passare a quella 'dinamica' (con la malloc() insomma :unz: ).
Se invece scegliessi di riscrivere il codice in c++ puoi semplicemente utilizzare la classe string :D

XWolverineX
30-08-2006, 22:20
Originariamente inviato da Samuele_70
Se invece scegliessi di riscrivere il codice in c++ puoi semplicemente utilizzare la classe string :D

che sa ridimensionarsi da sola.

Loading