Newsgroup: it.comp.lang.c
Titolo: Controllo grandezza array

Ho cercato ma non ho trovato una risposta chiara (per me) a questo problema.
Ho una variabile:
char parola[10];
In input (scanf) l'utente può immettere anche la divina commedia... come 
faccio ad evitare questo?
Controllo con strlen e un if?
Oppure che cosa?
Grazie ciao

 faccio ad evitare questo?
Molto semplice:
se scrivi scanf("%s",parola); allora la scanf cerchera' di leggere lo
stdin fino al primo blank e metterlo dentro parola, quindi
effettivamente
se tu batti  abcdeabcdeabcde (15 caratteri) strabordi.
Pero' puoi specificare la lunghezza massima nel formato della scanf:
con
scanf("%9s",parola);
stai sicuro che la scanf leggera' AL MASSIMO
9 caratteri dall'input (che poi diventano max 10 dentro parola[] perche'
viene aggiunto il terminatore 0).
ciao,
g.

 viene aggiunto il terminatore 0).
Grazie

 faccio ad evitare questo?
Hai provato con la funzione fgets() al posto della scanf()?
EMG
--
EMAG Software Homepage:     
http://www.emagsoftware.it
The EMG's ZX-Spectrum Page: 
http://www.emagsoftware.it/spectrum
The Best of Spectrum Games: 
http://www.emagsoftware.it/tbosg

 EMG
Si, ma se non ricordo male, con tutte le prove che faccio non mi ricordo 
bene, mi prende tutto l'input che metto...
ps. scusate il doppio post

 bene, mi prende tutto l'input che metto...
Non deve. Questo č il prototipo della funzione
char *fgets(char *s, int n, FILE *stream);
Il secondo parametro rappresenta esattamente lo spazio disponibile nel
buffer. Esempio:
char Buffer[ 100 ];
fgets( Buffer, 100, stdin );


 
Ah, capito. Provo a modificare come dici te.
Grazie ciao


Naturalmente dipende un po' dall'uso che ne devi fare:
la fgets prende una linea intera con spazi e tutto fino al fine linea
o fino alla dimensione specificata. Con la scanf puoi prelevare
parola per parola.
ciao,
g.

 fgets( Buffer, 100, stdin );
Ho fatto cosě, ma mi richiede un doppio return (invio) da parte 
dell'utente, perň, leggendo sui testi tutti indicano fgets come parte 
delle operazioni su file, cioč fgets legge righe intere, una alla volta, 
dal file, ma io devo leggere l'input da consolle.
O vale per tutti e due? E in ogni caso come si elimina la richiesta di 
doppio invio?
Grazie ciao

 Naturalmente dipende un po' dall'uso che ne devi fare:
Leggere input dall'utente in consolle, e metterlo nella variabile che 
scriverò su file.

 doppio invio?
Eccoti un esempio funzionante:
#include <stdio.h>
int main()
{
    char Buffer[ 100 ];
    printf( "Scrivi una riga e premi Invio: " );
    fgets( Buffer, 100, stdin );
    printf( "Avevi scritto: %s\n", Buffer );
    return 0;


 Eccoti un esempio funzionante:
Azz funziona perfettamente e senza bisogno di svuotare il buffer come 
facevo prima... maialazzo di un programma...
Bè ok ora passo alla scrittura...
grazie ciao

 Hai provato con la funzione fgets() al posto della scanf()?
Occhio solo ad un dettaglio: se leggi una riga ed il tuo buffer è di 200
caratteri, mentre l'utente inserisce "PIPPO" e batte invio, tu non
ottieni 5 caratteri + '\0', ma ottieni 5 caratteri + new_line (credo
dipenda dal sistema operativo, ma ho solo GNU/Linux e quindi non so
dirti se su Win sia \n o \r\n) + '\0'. Quindi potresti aver bisogno di
rimuovere il newline dalla stringa.
-- 
Andrea Bergia - studente              Linux Registred User #281550
"The one thing we're all waiting for, is peace on Earth and an end to
war,
it's a miracle we need, the miracle, the miracle, 
Peace on earth and end to war today,
That time will come one day you'll see when we can all be friends"

 dipenda dal sistema operativo,
No, non dipende dal sistema operativo. E' il comportamento standard
della fgets().


 della fgets().
Mi sono espresso male. Intendevo dire che il carattere di new line
dipende dal sistema operativo: esempio sul mio GNU/Linux è '\n', mentre
non so cosa sia nè su Win nè su Mac.


 non so cosa sia nč su Win nč su Mac.
E' '\n' su tutti i sistemi in quanto quello č il simbolo che in C indica
il new line. A cosa corrisponda poi esattamente dipende dal sistema
operativo, questo sě.


non so cosa sia nč su Win nč su Mac.
\r\n su windows
\r su mac
\n sui *nix
ciao sbirish

 \n sui *nix
No, non è così, come ho già detto.


EMG
sbirish

 ... come ansi vuole.
Posso sbagliare, ma a me sembra che lo standard non dica questo ma dica
solo che \n è il new line che può essere CR, CR + LF, LF o qualunque
altra convenzione adottata sul sistema operativo ospite. Infatti
printf( "\n" );
dovrebbe andare a capo su qualunque sistema.


dovrebbe andare a capo su qualunque sistema.
lo standard naturalemente non può dire nulla.. 
lo standard dice soltanto che \n manda un line feed(0x0a),
cosa significhi dipende dal contesto.. 
newline NL (LF) \n
horizontal tab HT \t
vertical tab VT \v
backspace BS \b
carriage return CR \r
( draft c++ )
NL e LF sono la stessa cosa... io intendevo cosa "significasse"
per i sistemi uno \n .. se "butti" solo uno \n su windows in un file
invece di uno \r\n e lo apri con notepad.. vedi degli strani
simboletti.. idem se usi "\r\n" su uno unix e lo apri con vi vedi dei
^M tutto lì quello che volevo dire..
credo di aver solo frainteso cosa voleva chiedere nel post
precedente.. tutto lì..
sbirish

 simboletti..
Ci hai mai provato? Certamente no, altrimenti non diresti questo.


EMG
sbirish

 0x0a.
Ci siamo! Parlavamo di due situazioni diverse. Io parlavo dell'apertura
in modalità testo mentre tu in modalità binaria. E francamente avevo
dimenticato il particolare della trasformazione del '\n' in modalità
testo.
Scusa per l'insistenza.
