[c] Ciclo do/while, alla seconda iterazioni mi si esegue due volte di seguito

di sevenjeak il
4 risposte
Salve,

E' da molto che, per vari ragioni, non scrivo su questo forum, comunque, riprendo a riscriverci con questo problema.

Sto, dopo tanto tempo in qui lo lasciato perdere, pensando ad altri linguaggi, rivedendo il C, ho questo codice:
#include <stdio.h>
#include <ctype.h>

int main() {
   int vocal_tot = 0;
   char c;
   
   do {
	   printf("Type a character, type '#' to terminate :> ");
	   scanf("%c", &c);
	   
	   c = tolower(c);
	   
	   if (c == 'a' || c == 'e' || c == 'i' || c == 'o' || c == 'u') {
	      vocal_tot++;
	   }
	   
	   printf("\n");
   }while (c != '#');
   
   printf("Vocal tot => %d", vocal_tot);
}
Fino alla pressione di un carattere ( scanf(%"c", &c) ) tutto bene, premendo invio però, mi stampa due volte il printf(), prima istruzione del do, e cose mi avviene per tutte le iterazione successive, come mai? spero che il mio problema sia chiaro, nel caso, invio una foto di cosa mi accede dopo aver digitato il carattere e premuto invio:


P.S.: Per il resto, se digito # mi esce e mi stampa correttamente il conteggio delle vocali.

4 Risposte

  • Puoi provare con [CODE] ... printf("Type a character, type '#' to terminate :> "); scanf("%c", &c); flushall(); ...
  • Ciao, il problema è che scanf() lascia il carattere newline \n dovuto al tasto invio nel buffer di inserimento e tale carattere verrà letto dalla scanf() successiva, che sembrerà venire saltata.
    La soluzione più semplice è modificare la riga
    scanf("%c", &c);
    in
    scanf(" %c", &c);
    per fare in modo che la funzione ignori i caratteri whitespace, di cui \n fa parte.
  • Aggiungendo la funzione flushall() mi da due errori, ovvero: implicit declaration of function 'flushall' [-Wimplicit-function-declaration] e undefined reference to `flushall' collect2.exe: error: ld returned 1 exit status, ho bisogni di includere qualche altra libreria per utilizzare la funzione?

    Provando invece quello che ha scritto nippolo, funziona tutto correttamente, non ho ben capito però come mai si verifica il problema.

    Grazie per l'aiuto.
  • Flushall() non è standard C, comunque in generale il flush si fa sugli output su cui hai controllo, non sugli input. La soluzione di nippolo è quella corretta
Devi accedere o registrarti per scrivere nel forum
4 risposte