Newsgroup: it.comp.lang.c
Titolo: Cosa devo dare?

Saluti a tutti gli inquilini dell'NG.
Il mio problema temporaneo (programmo alle prime armi in C/C++ per DOS) č
quello di proteggere l'input da console. Forse mi spiego meglio facendovi
prima vedere il codice che vorrei modificare.
int a, b, c, d, e;
....
Immissione:
    cin >>a >>b >>c >>d >>e;
....
if (...) goto Immissione;
Vorrei che quando chiamo l'istruzione cin (al limite scanf(..)) mi venga
controllata l'immissione. Se per esempio metto 6 numeri in input invece di
5, il sesto valore mi va nella variabile "a" del ciclo successivo. Non posso
permetterlo.
Concretamente:
io scrivo:
1 2 3 4 5 6
quindi mi ritroverň:
a=1 b=2 c=3 d=4 e=5
il ciclo successivo mi ritrovo con a=6 e l'input:
9 8 7 6 5
il problema č che il 9 finisce in b e non in a...
Scusate se non mi sono spiegato bene! Cercate di aiutarmi.
Ultima cosa: se potete (ma non per forza, č gia tanto che mi rispondiate:-)
fate il replay alla mia mailbox personale: 
info...@keycomm.it
CIAO!

Ultima cosa: se potete (ma non per forza, è gia tanto che mi rispondiate:-)


Pare di capire che quello che intendi fare e' un input
_orientato alla linea_ -- immettere una linea dalla quale
vengono letti esattamente 5 valori, ne' piu` ne' meno,
mentre l'orientazione-base di iostream (come quella
di stdio) e' mediamente abbastanza indifferente ai
fine-riga, che tratta di default come qualsiasi altro
spazio bianco.
Se ho capito bene cosa intendevi, dunque, quel che
devi fare puoi dividerlo in due sotto-compiti:
1. immettere una linea di testo dall'input, poi
2. estrarre da quella linea di testo i valori
Non capisco perche' tu scriva su it.comp.lang.c
quando pare invece che tu stia usando il linguaggio
C++ (visto che usi cin>>eccetera); ti rispondo in
termini di C, ma ti invito anche calorosamente ad
imparare a usare il gruppo giusto per le due domande
(ripeti la domanda in it.comp.lang.c++ se vuoi la
risposta in termini di C++).
Per il compito 1 puoi usare la funzione gets, ma
e' molto insicura -- se immetti una linea troppo
lunga, e' probabile un crash del tuo programma;
meglio la funzione fgets, cui almeno puoi dire
quanto spazio hai riservato per l'array di char
(cosiddetta "stringa" in C) -- se la riga di input
e' piu` lunga, verranno letti solo i primi N char
(se la cosa per te e' importante, puoi verificare
questo dettaglio: se la fgets ha letto una intera
riga, allora nell'array di caratteri che le hai
passato troverai un carattere \n prima dello
zero di terminazione -- altrimenti, puoi operare
sullo stream di standard input per garantire che
siano "buttati via" i caratteri in eccesso, ad es.
con un ciclo di ulteriori fgets sinche' una di esse
non pone un '\n' nell'array).  Per sapere se un
certo array di caratteri (terminato da 0 binario)
contiene un dato carattere, puoi usare la funzione
strchr, che ti torna il puntatore alla prima occorrenza
di quel carattere nell'array, o 0 (puntatore nullo) se
il carattere non vi si trova.
Una volta che hai letto con successo la riga di
testo (o, se molto lunga, almeno quella parte di
essa che ti interessa), puoi usare sscanf per
estrarre valori dalla riga stessa.  sscanf torna
il numero di valori che e' riuscita ad estrarre dalla
"stringa" (array di caratteri terminato da 0), a
seconda del formato che hai specificato, e a
memorizzare ("assegnare") alle variabili i cui
indirizzi le hai pure passato; in questo modo puoi
controllare se esattamente 5 valori sono stati
assegnati, oppure di meno (non saranno mai di
piu`, poiche` passerai l'indirizzo di 5 sole variabili
in cui memorizzare i valori stessi) -- tocchera' poi
a te decidere cosa fare se i valori sono meno di
5 (usare valori di default, terminare il programma
con errore, emettere un warning, richiedere altro
input, o quant'altro sia appropriato nel tuo caso).
Giusto per "stringere le fila" del discorso, ecco una
versione semplice semplice, che "butta via" qualsiasi
parte della riga eccedente i 1024 caratteri, e non
modifica i valori delle ultime variabili se sono stati
immessi meno di cinque valori:
/*
 * ritorna: il numero di valori effettivamente
 * assegnati (da 0, a 5, inclusi)
 */
#define MAXLINELEN (1024+1)
int
leggiCinque(int*a, int*b, int*c, int*d, int*e)
{
    int nRead;
    char buffer[MAXLINELEN];
    /* legge una riga (primi 1024 caratteri o meno) */
    if(!fgets(buffer, MAXLINELEN, stdin))
        /* errore o end-of-file: nessun valore */
        return 0;
    /* estrae da 0 a 5 valori dalla riga stessa */
    nRead = sscanf(buffer, "%d %d %d %d %d",
        a, b, c, d, e);
    /* sinche' non trova un line-feed, o stdin non va
     * in errore o end-of-file, legge e ignora dei char
     */
    while(!strchr(buffer,'\n'))
        if(!fgets(buffer, MAXLINELEN, stdin))
            break;
 
    return nRead;
}    
Alex