Controllo dei valori inseriti da tastiera in un array di interi

di il
10 risposte

Controllo dei valori inseriti da tastiera in un array di interi

Salve a tutti, ho questo programmino in C in cui, nella parte iniziale, inserisco dei numeri interi all'interno di un array e vorrei controllare,ad ogni inserimento da tastiera, che il valore inserito all'interno dell'array sia un numero intero e nel caso non lo fosse dovrebbe apparire un messaggio di errore e farmi reinserire il numero.
Ho pensato di memorizzare il valore di ritorno della funzione scanf() in una variabile, confrontarlo col valore 0 all'interno di un if, il tutto all'interno di un ciclo do while.
Finchè inserisco valori numerici interi va tutto bene ma quando inserisco altri caratteri entra in un loop infinito, siccome sono un principiante del linguaggio C non riesco a capire l'errore, qualcuno può aiutarmi?
Grazie a chiunque risponda.

#include<stdio.h>
#define SIZE 5

int main(){

int i, num, v[SIZE];

  for (i=0;i<SIZE;i++){


       printf("Inserire un numero intero nella posizione %d del vettore\n ", i+1);
       
       do {
        num = scanf(" %d", &v[i]);
        if (num == 0) {
             printf(" Attenzione : input non  valido, riprovare.\n");
             }
         }while (num == 0);
      }
    }

10 Risposte

  • Re: Controllo dei valori inseriti da tastiera in un array di interi

    Per numero intero intendi un numero diverso da zero? Che valori inserisci per mandarlo in loop?
  • Re: Controllo dei valori inseriti da tastiera in un array di interi

    Ciao, in pratica se da tastiera inserisco un valore che contiene un carattere diverso da una cifra , ad esempio una lettera, inizia a stampare sullo schermo la frase "Attenzione input non valido, riprovare" all'infinito e devo terminare il programma.
  • Re: Controllo dei valori inseriti da tastiera in un array di interi

    Scusa, avevo letto male. Prova a pulire il buffer manualmente:
    
           do {
            num = scanf(" %d", &v[i]);
            if (num == 0) {
                 while('\n'!=getchar());
                 printf(" Attenzione : input non  valido, riprovare.\n");
                 }
             }while (num == 0);
          }
        }
    
  • Re: Controllo dei valori inseriti da tastiera in un array di interi

    Ho aggiunto il while e adesso il problema non si presenta più, ho notato però che se inserisco un valore numerico composto da più cifre con in mezzo altri simboli, ad esempio 3f8 appare la scritta "Attenzione input non valido, riprovare" ma lo memorizza comunque e mi chiede di inserire l'elemento successivo dell'array; c'è un modo per risolvere anche questo problema?
  • Re: Controllo dei valori inseriti da tastiera in un array di interi

    Il problema è che se inserisci 4f8 il 4 lo prende per buono e lo memorizza nel vettore, e non entra nell'if, mentre "f8" rimane nel buffer. Si risolve mettendo la while subito dopo la scanf. Resta però il fatto che non da errore se inserisci una tale combinazione.

    Forse l'unico modo è fare un controllo manuale sull'imput inserito, salvando tutto in una stringa e solo se non ci sono caratteri errati, usare la sscanf usando quella stringa come buffer, ma non l'ho mai provato.
  • Re: Controllo dei valori inseriti da tastiera in un array di interi

    Il C è notoriamente un linguaggio scomodo per fare queste cose.

    Come possibile soluzione, potresti fare uno scanf su un array di char, poi fai strtol su quell'array e se ti restituisce un numero diverso da zero allora è un intero valido, se ti restituisce zero devi controllare manualmente che quel numero sia proprio zero oppure una stringa che non rappresenta un numero

    Una cosa simile veniva fatta qui https://www.iprogrammatori.it/forum-programmazione/cplusplus/problemi-con-eof-t44312.html?hilit=strtol#p8658852
  • Re: Controllo dei valori inseriti da tastiera in un array di interi

    Credo che la cosa più semplice sia leggere una stringa e, dopo tutti controlli del caso, convertirla in un intero.
    Per controlli mi riferisco al fatto che i caratteri inseriti siano tutti validi e che il numero inserito rientri nel range del tipo intero che andrai ad utilizzare (per esempio int non è abbastanza capiente per 999999999999999999999).

    In ogni caso qualcosa del genere sembra funzionare:
    #include <stdio.h>
    
    int main()
    {
        int a;
        while(1)
        {
            printf("a-> ");
            if(scanf("%d", &a) && getchar() == '\n')
            {
                break;
            }
            while(getchar() != '\n');
        }
        printf("\na = %d\n", a);
    
    	return 0;
    }
  • Re: Controllo dei valori inseriti da tastiera in un array di interi

    Grazie a tutti per le risposte, adesso ho provato a riscrivere il codice come proposto nella soluzione di Nippolo e sembra funzionare, adesso vorrei capire una cosa, nell'istruzione if il programma controlla che ogni carattere inserito diverso da \n sia un intero e nel caso non lo fosse passa al ciclo while interno, giusto?
    Secondo voi può andar bene scritto così o si può migliorare?
    #include<stdio.h>
    #define SIZE 5
    
    int main(){
    
    int i,v[SIZE];
    
       for(i=0;i<SIZE;i++){
        
        while(1){
            
            printf("Inserisci l'elemento in posizione %d dell'array\n ", i+1);
    
            if(scanf("%d", &v[i]) && getchar() == '\n'){
               break;
            }
            while(getchar() != '\n'){
             printf("Attenzione : input non  valido, riprovare.\n");
            }
          } // fine del while esterno
       } //fine del for
    }//fine del main
    
  • Re: Controllo dei valori inseriti da tastiera in un array di interi

    BaroneRotto ha scritto:


    adesso vorrei capire una cosa, nell'istruzione if il programma controlla che ogni carattere inserito diverso da \n sia un intero e nel caso non lo fosse passa al ciclo while interno, giusto?
    L'if controlla che scanf() abbia letto qualcosa e che nel buffer di inserimento ci sia \n. Se si verificano entrambe le condizioni il break consente l'uscita dal while più esterno, altrimenti verrà eseguito il while più interno che ha il compito di pulire il buffer prima del prossimo tentativo di inserimento.

    BaroneRotto ha scritto:


    Secondo voi può andar bene scritto così o si può migliorare?
    #include <stdio.h>
    
    #define SIZE 5
    
    int main()
    {
        int v[SIZE];
        for(unsigned int i = 0; i < SIZE; ++i)
        {
            printf("v[%d] ->\n", i);
            while(!scanf("%d", &v[i]) || getchar() != '\n')
            {
                while(getchar() != '\n');
            }
        }
    }
  • Re: Controllo dei valori inseriti da tastiera in un array di interi

    Perfetto, adesso funziona, grazie a tutti per le risposte.
    
    #include<stdio.h>
    #define SIZE 5
    
    int main(){
    
        int v[SIZE];
        for(unsigned int i = 0; i < SIZE; ++i){
            
            printf("v[%d] ->\n", i);
            while(!scanf("%d", &v[i]) || getchar() != '\n'){
                
                while(getchar() != '\n');
                
                printf("Attenzione : input non  valido, riprovare.\n");
            
            }
        }
    }
Devi accedere o registrarti per scrivere nel forum
10 risposte