Problema con printf

di il
17 risposte

Problema con printf

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

  • Re: Problema con printf

    E il while cosa è ?
  • Re: Problema con printf

    Sì, ma la printf è dopo un else... quel while lì cosa fà?
  • Re: Problema con printf

    Ma scusa ... è il tuo codice e non sai cosa fa la while?
  • Re: Problema con printf

    So cosa fà il while, non capisco perchè quel while mi itera anche la printf
  • Re: Problema con 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().
  • Re: Problema con printf

    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 !!!
  • Re: Problema con printf

    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?
  • Re: Problema con printf

    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.
  • Re: Problema con printf

    Ah ho capito!! pensavo che la getchar() li ignorasse quelli in più!! e le 2 printf sono perchè il secondo carattere è l'invio?
  • Re: Problema con printf

    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
  • Re: Problema con printf

    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
  • Re: Problema con printf

    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).

  • Re: Problema con printf

    Con atoi() controllo però carattere per carattere giusto? dovrei poi moltiplicarlo x 10 alla posizione in cui è quel carattere giusto?
  • Re: Problema con printf

    No, hai letto la pagina che ti ho linkato? http://www.cplusplus.com/reference/cstdlib/atoi
    atoi converte direttamente una stringa nel numero corrispondente.
Devi accedere o registrarti per scrivere nel forum
17 risposte