PDA

Visualizza la versione completa : [C] controllo variabile


SirSeymour
26-12-2004, 17:09
Se dichiaro una varibile "a" come int, quando faccio scanf e inserisco un carattere il programma incomincia ad impazzire...
Come faccio a controllare che l'utente metti solamente un int e nn un altro tipo di variabile?
Spero di essere stato chiaro!

Buone feste

anx721
26-12-2004, 18:16
La scanf ritorna il numero di elementi letti con successo; in particolare, se leggi una sola varibile puoi fare:

int read = scanf("%d", &var);
if(read == 0){
// significa che non stata letta correttamente la variabile
}

SirSeymour
28-12-2004, 10:23
grazie.
Ma ho provato ripetutamente, ma nn riesco a far in modo che l'utente riprovi a mettere la variabile.
Per esempio io per controllare che il numero inserito sia > di 0 inserisco questo ciclo, ma con int read... nn riesce!


while (res<0 || res==0) {
printf("________|il numero deve essere maggiore di 0|_________\n");
printf("Inserisci un numero (considera solo le prima 5 cifre!) : ");
scanf("%5d",&res);
}

pprllo
28-12-2004, 10:46
Fai cos:


int ok;
int res;
do
{
ok = scanf("%5d", &res);
}while (ok==0)

SirSeymour
28-12-2004, 11:34
nn funziona.
Ho messo anche il ; alla fine del while,nn mi fa ripetere l'inserimento...va a capo e esce il cursore che lampeggia fermo..!
Come mai
?

anx721
28-12-2004, 12:10
Se vuoi controllare sia che la scanf abbia effettuato l'assegnamento, sia che la variabile letta sia positiva, un modo di precedere il seguente (nota l'sitruzione fflush(stdin) che serve per svuotare il buffer di input, che altrimenti pu dare problemi quando si leggono caratteri)



int res = 0;
int ok;
do{
ok = 0;
fflush(stdin);
printf("Inserisci il numero: ");
ok = scanf("%d", &res);
if(ok == 0)
continue;
if(res <= 0)
printf("\nIl numero deve essere positivo!: ");
}
while(res <= 0);

SirSeymour
28-12-2004, 12:26
GRAZIE MILLE

SirSeymour
29-12-2004, 17:31
fflush(stdin);
cosa ? a cosa serve precisamente?c' una guida su internet che spiega meglio il funzionamento di questa funzione?

grazie

Ilmalcom
29-12-2004, 17:49
Originariamente inviato da SirSeymour

fflush(stdin);
cosa ? a cosa serve precisamente?c' una guida su internet che spiega meglio il funzionamento di questa funzione?

grazie
Tratto dalla man page di fflush


NAME
fflush - flush a stream

SYNOPSIS
#include <stdio.h>

int fflush(FILE *stream);

DESCRIPTION
The function fflush forces a write of all user-space buffered data for
the given output or update stream via the stream's underlying write
function. The open status of the stream is unaffected.

If the stream argument is NULL, fflush flushes all open output streams.

For a non-locking counterpart, see unlocked_stdio(3).

RETURN VALUE
Upon successful completion 0 is returned. Otherwise, EOF is returned
and the global variable errno is set to indicate the error.

ERRORS
EBADF Stream is not an open stream, or is not open for writing.

The function fflush may also fail and set errno for any of the errors
specified for the routine write(2).

NOTES
Note that fflush() only flushes the user space buffers provided by the
C library. To ensure that the data is physically stored on disk the
kernel buffers must be flushed too, e.g. with sync(2) or fsync(2).

CONFORMING TO
The function fflush() conforms to ANSI X3.159-1989 (``ANSI C'').

SEE ALSO
fsync(2), sync(2), write(2), fclose(3), fopen(3), setbuf(3),
unlocked_stdio(3)

anx721
29-12-2004, 18:14
Da:

http://www.cplusplus.com/ref/

Flush a stream.
If the given stream has been opened for writing operations the output buffer is phisically written to the file.
If the stream was open for reading operations the content of the input buffer is cleared.
The stream remains open after this call.

In pratica, se lo stream di input, serve a cancellare l'eventuale input inserito dall'utente e non ancora letto dal programma; se lo stream e di output, il contenuto del buffer, scritto dal programma e non acora fisicamente scritto (ad esempio in un file a cui e collegato lo stream) viene scritto.

Loading