Problema con printf

di Anonimizzato11712 il
17 risposte
Ciao questo è il mio codice: lui rileva giusto se quello che ho inserito è un numero o no, ma quando non inserisco un numero mi stampa la printf di errore tante volte +1 dei caratteri che ho inserito. Se per esempio inserisco "ciao" lui mi stamperà 5 messaggi d'errore... Eppure non ho messo la printf dentro nessun ciclo!! Come mai succede così? Grazie!

#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
const char* domanda="Inserisci intero\n";
int main()
{
char tmp;
int ok;
int giusto=0;

printf("%s",domanda);
while(!giusto)
{
tmp=getchar();
if(isdigit((int)tmp)!=0)
{
ok=(int)tmp-'0'; giusto=1; printf("ok  %d\n", ok);
}
else printf("Errore! Inserisci un numero intero!\n");
}

return 0;
}

17 Risposte

  • E il while cosa è ?
  • Sì, ma la printf è dopo un else... quel while lì cosa fà?
  • Ma scusa ... è il tuo codice e non sai cosa fa la while?
  • So cosa fà il while, non capisco perchè quel while mi itera anche la printf
  • So cosa fà il while, non capisco perchè quel while mi itera anche la printf
    Qual è il problema? Se tu inserisci "ciao"ti verrà stampato 4 volte ""Errore! Inserisci un numero intero!", se poi dai anche un Invio te lo stamperà una volta ancora.
    Eppure non ho messo la printf dentro nessun ciclo!!
    La printf() attualmente E' nel ciclo.
    Attualmente OGNI carattere che inserisci viene processato; si esce dal ciclo se il carattere inserito è una CIFRA.
    Se vuoi che l'utente inserisca un NUMERO potresti fare un'unica lettura con fgets(), verificare con un ciclo sul buffer letto che tutti i caratteri siano cifre e, se sì, trasformare il buffer letto in intero con atoi().
  • Mattia541993 ha scritto:


    So cosa fà il while, non capisco perchè quel while mi itera anche la printf
    Ovvio che itera anche la printf dato che sta dentro il ciclo !!!
  • Ok ma il getchar, mica prende solo un carattere? In teoria il getchar() legge il carattere, poi lo si controlla, si stampa un messaggio in caso di errore e riparte il while... quando la seconda tornata di while ritorna al getchar() il programma non si dovrebbe mettere in attesa di un input e poi ricontrollarlo? E anche se trova che un carattere non và bene, perchè mi stampa 2 printf e non solo una poi mi richiede di inserire un altro carattere?
  • Mattia541993 ha scritto:


    ok ma il getchar, mica prende solo un carattere? In teoria il getchar() legge il carattere, poi lo si controlla, si stampa un messaggio in caso di errore e riparte il while... quando la seconda tornata di while ritorna al getchar() il programma non si dovrebbe mettere in attesa di un input e poi ricontrollarlo? E anche se trova che un carattere non và bene, perchè mi stampa 2 printf e non solo una poi mi richiede di inserire un altro carattere?
    La funzione getchar (come dice il suo nome) prende un solo carattere.

    Se scrivi

    ciao

    e invio, con la getchar ottieni 5 caratteri che sono controllati all'interno del ciclo while. Dato che tutti e 5 i caratteri sono sbagliati la printf che hai inserito nel ciclo sarà eseguita 5 volte. Mi sembra semplice.
  • Ah ho capito!! pensavo che la getchar() li ignorasse quelli in più!! e le 2 printf sono perchè il secondo carattere è l'invio?
  • Perché dovrebbe ignorarli? La getchar viene eseguita nel ciclo e per ogni giro accetta un carattere.

    Perché 2 printf? Ne fa una in più per l'invio ...

    Comunque usa una fgets per l'input di una stringa al posto della getchar
  • Già! Inoltre con getchar() ho visto che se inserisco un numero con x es 2 cifre me ne prende solo una... con fgets posso prendere un numero di n cifre e poi prendere carattere x carattere, convertirlo in cifra intera e moltiplicarlo per una potenza di 10 in base alla posizione... dici che potrebbe funzionare? o in alternativa: non c'è una funzione già fatta che mi permette di verificare se ho inserito un numero o no? mi sembra stra macchinosa da fare come cosa!! Intanto grazie per l'aiuto che mi stai dando
  • Ciao,
    secondo me per verificare che il numero sia valido devi procedere controllando che ogni carattere inserito sia una cifra e non, ad esempio, una lettera.

    Quando sei sicuro che l'input sia valido, puoi convertirlo direttamente in numero con la funzione atoi(ASCII to integer).

  • Con atoi() controllo però carattere per carattere giusto? dovrei poi moltiplicarlo x 10 alla posizione in cui è quel carattere giusto?
Devi accedere o registrarti per scrivere nel forum
17 risposte