Problema con programma che crea un quiz di 3 domande.

di Anonimizzato24121 il
11 risposte
Ciao ragazzi, dovrei creare una specie di quiz di 3 domande su un argomento a piacere a cui l'utente possa rispondere semplicemente V/F. Ho scritto questo codice, ma da problemi con la seconda domanda, mi visualizza una risposta prima che l'utente l'inserisca... il resto del programma funziona. Sapete aiutarmi? Grazie
/Realizzare un programma che presenti 3 domande sulla musica Rock a cui l'utente possa rispondere vero o falso (v\f). Il punteggio iniziale è 0, ogni risposta esatta vale 1 punto. Al termine si visualizzi il punteggio ottenuto dall'utente.
//		counter = counter + 1;
#include <stdio.h>
#include "stdafx.h"

char risp1;
char risp2;
char risp3;
int counter = 0;

int main()
{
	printf("BENVENUTO AL NOSTRO QUIZ SULLA MUSICA ROCK E SOTTOGENERI!\n\n");

	printf("Domanda n1. Kurt Cobain fu' lo storico leader dei Nirvana. (V\\F)  ");
	scanf_s("%c", &risp1);
	if (risp1 == 'v' or risp1 == 'V')
		printf("Esatto! Cobain fu' chitarrista e cantante dei Nirvana dal 1987 al 1994. (+1 punto)");
	else printf("Risposta sbagliata. Cobain fu' chitarrista e cantante dei Nirvana dal 1987 al 1994. (+0 punti)");

	printf("\n\n\nDomanda n2. La celeberrima traccia 'Dazed and Confused' dei Led Zeppelin e' in realta' una cover. (V\\F)  ");
	scanf_s("%c", &risp2);
	if (risp2 == 'v' or risp2 == 'V')
		printf("Risposta esatta! e' una rielaborazione dell'omonimo brano di Jake Holmes. (+1 punto)");
	else printf("Risposta errata. Dazed and Confused e' una rielaborazione dell'omonimo brano di Jake Holmes. (+0 punti)");
	
    
	printf("\n\n\nDomanda n3. Brian Patrick Carroll (meglio conosciuto come 'Buckethead') fu' il chitarrista con i quali i Guns 'N Roses registrarono il loro album di debutto 'Appetite for Destruction'. (V//F)  ");
	scanf_s("%c", &risp3);
	if (risp3 == 'f' or risp3 == 'F')
		printf("Risposta corretta! Buckethead registro' con i Guns 'N Roses solo l'album 'Chinese Democracy', 'Appetite for Destruction' fu' registrato con lo storico chitarrista dei G'N'R, Slash. (+1 punto)");
	else printf("Risposta errata. Buckethead registro' con i Guns 'N Roses solo l'album 'Chinese Democracy', 'Appetite for Destruction' fu' registrato con lo storico chitarrista dei G'N'R, Slash. (+0 punti)");
	scanf_s("%d");
		

	return 0;
}

11 Risposte

  • Prova a far seguire ad ogni chiamata a scanf() una chiamata a getchar()...
  • AldoBaldo ha scritto:


    Prova a far seguire ad ogni chiamata a scanf() una chiamata a getchar()...
    Cosi funziona, grazie ma mi sapresti spiegare perchè il mio codice precedente dava problemi ed invece quello che mi hai suggerito tu no?
  • Sono stato fuori per una settimana. Rispondo ora.

    Per qualche ragione, scanf() lascia nello stream di input il carattere '\n'; getchar() lo "capta", togliendolo dallo stream di input.
  • Non "per qualche ragione" come se fosse un bug. Il \n non viene consumato perché nella stringa di formato non compare nulla che indichi che debba essere fatto, quindi rimante nel buffer.
  • "Qualche ragione" includeva la possibilità di quella ragione lì. Hai fatto bene a precisare.
    A questo punto, però, stuzzichi una domanda: la tua precisazione implica che si può formulare la stringa di formato in scanf() in modo che il '\n' venga "digerito" senza il getchar() successivo? Se sì, come? Con qualcosa tipo "%d\n" o "%s\n"? Con "%d%c" (il %c per intercettare il carattere '\n')? Non ho mai provato, proverò (ci vogliono due minuti). Però se metti qui la risposta può essere utile anche ad altri.
  • Basta inserire uno spazio prima di %c

    " %c"
  • Dunque, ipotizzando di voler "ricevere" un intero senza lasciare "pendenze" basta scrivere...

    scanf( "%d %c", &variabile_int, &variabile_char );

    Corretto?
  • Con un intero non hai il problema del newline ti basta "%d"

    Che vuoi dire?
  • Intendo rimanere sul tema del '\n' "pendente" che rimane nello stream dopo che ne hai "estratto" l'intero. Quello per eliminare il quale, nella mia prima risposta, ho suggerito di aggiungere un getchar() dopo la scanf().

    Comunque sia, per tagliare la testa al toro, ho provato in prima persona con questi risultati:
    #include <stdio.h>
    #include <stdlib.h>
    
    int main() {
        int n, cInt;
        char c;
    
        scanf( "%d", &n );
    
        /*
        nella scanf() qui sopra, ricevo l'intero in n e rimane un '\n' nello stream
        */
    
        cInt = getchar();
    
        /*
        con questo getchar() verifico che in effetti c'era un '\n' "pendente" nello
        stream (cInt riceve 10) e lo "elimino"
        */
    
        scanf( "%d", &n );
        getchar();
    
        /*
        cosi', con scanf() ricevo l'intero in n e '\n' rimane nello stream
               con getchar() elimino quel '\n' dallo stream stesso, scartandolo
        */
    
        scanf( "%d %c", &n, &c );
    
        /*
        nella scanf() qui sopra, ricevo l'intero in n e un carattere in c, e
        rimane un '\n' nello stream (come effettivamente mi aspettavo, quello
        spazio "guasta" il risultato, impedendo d'ottenere lo scopo che mi
        prefiggevo di ottenere)
        */
    
        cInt = getchar();
    
        /*
        con questo getchar() verifico che in effetti c'era un '\n' "pendente" nello
        stream (cInt riceve 10) e lo "elimino"
        */
    
        scanf( "%d%c", &n, &c );
    
        /*
        nella scanf() qui sopra, ricevo l'intero in n e '\n' in c, e nello stream
        non rimane nulla; il risultato e' equivalente a usare scanf("%d",&n) e
        getchar() in sequenza, che e' quello che volevo verificare
        */
    
        return 0;
    }
    
  • In questi casi usa %*c


    scanf("%d%*c", &n);

    scanf("%d %c%*c", &n, &c);
  • E' vero! Così (con *) non c'è bisogno di passare l'indirizzo di una variabile che "riceva" il carattere, perché il valore corrispondente viene letto e "buttato via". Sì, ricordo di aver letto di quella caratteristica, ma non ho mai avuto bisogno/occasione di usarla.
Devi accedere o registrarti per scrivere nel forum
11 risposte