getchar non funzionante

Pubblicità
Stato
Discussione chiusa ad ulteriori risposte.

GabrieleRavelli

Nuovo Utente
Messaggi
103
Reazioni
5
Punteggio
37
Buonasera, sto facendo questo codice in C per trovare la circonferenza di un cerchio ma quando eseguo il .exe dopo aver scritto il raggio mi chiude il terminale, ho quindi aggiunto getchar(); ma non funziona comunque. Sapete aiutarmi? Grazie
C:
#include <stdio.h>

#define pgreco 3.14;
main()
{
    float raggio;
    printf("\nCalcolo della circonferenza di un cerchio\n\n");
    printf("Inserisci la lunghezza del raggio: ");
    scanf("%f", &raggio);
    float circonferenza = raggio * 2 * pgreco;
    printf ("La circonferenza e': %f ", circonferenza );
    getchar();
}
 
Ultima modifica da un moderatore:
Buonasera, sto facendo questo codice in C per trovare la circonferenza di un cerchio ma quando eseguo il .exe dopo aver scritto il raggio mi chiude il terminale, ho quindi aggiunto getchar(); ma non funziona comunque. Sapete aiutarmi? Grazie
C:
#include <stdio.h>

#define pgreco 3.14;
main()
{
    float raggio;
    printf("\nCalcolo della circonferenza di un cerchio\n\n");
    printf("Inserisci la lunghezza del raggio: ");
    scanf("%f", &raggio);
    float circonferenza = raggio * 2 * pgreco;
    printf ("La circonferenza e': %f ", circonferenza );
    getchar();
}

Il problema è causato dal "new line" (quando premi invio) che rimane nel buffer di input. Modifica la scanf con scanf("%f ", &raggio); (nota lo spazio dopo lo specificatore di formato) e dovrebbe andare.

Un altro modo, e non so quanto sia una "best practice", è pulire l'stdin in questo modo:
C:
    fflush(stdin);
    getchar();

Dovrebbe funzionare anche la soluzione di ilfe, solo che non è portabile (funziona solo su Windows).

Un paio di Hint relativi al tuo codice:
  • main() dovrebbe tornare un int, se non specifichi il tipo viene assunto int come default
  • la #define non necessita del punto e virgola, e per altro ti porta ad errori
In merito all'ultimo punto, non so se sai come funzionano le direttive del preprocessore: la define non è una costante, è una vera e propria etichetta che viene rimpiazzata dal preprocessore (fase che precede la compilazione del tuo programma). Con il tuo codice il preprocessore produce questo:

C:
main()
{
    float raggio;
    printf("\nCalcolo della circonferenza di un cerchio\n\n");
    printf("Inserisci la lunghezza del raggio: ");
    scanf("%f", &raggio);
    float circonferenza = raggio * 2 * 3.14;;
    printf ("La circonferenza e': %f ", circonferenza );
    getchar();
}

come noti c'è un doppio "punto e virgola" dopo "3.14", ed è quello che hai inserito tu nella define. 😉
L'output del preprocessore lo ottieni con -E, specifica magari -nostdinc (per non vedere tutto, ma solo il tuo codice), quindi: gcc main.c -E -nostdinc.
 
Come al solito esaustivo, ho inteso il suo messaggio come semplice attesa per leggere l'out. Non mi sono posto ne problemi di convenzioni ne di os dato il doppio click sul .exe
 
altra nota,
in C89 or ANSI standard C, le variabili si definiscono tutte in testa,
ad inizio "scope", per buona norma,
poi i compilatori moderni ti consentono di definirle ovunque, coem in c++,
ma io rispetterei gli standard.

aggiungendo i consigli di @DispatchCode ecco il tuo codice revisionato

Codice:
#include <stdio.h>

#define pgreco 3.14

int main()
{
        float raggio, circonferenza;

        printf("\nCalcolo della circonferenza di un cerchio\n\n");
        printf("Inserisci la lunghezza del raggio: ");
        scanf("%f", &raggio);
        getchar();
        circonferenza = raggio * 2 * 3.14;
        printf ("La circonferenza e': %f\n ", circonferenza);
        getchar();
       
        return 0;
}
 
Ultima modifica:
poi i compilatori moderni ti consentono di definirle ovunque, coem in c++,
ma io rispetterei gli standard
se non ricordo male, a partire dal C99 (ISO/IEC 9899:1999) lo standard consente la dichiarazione "al volo" delle variabili dove necessario (anche nelle parentesi tonde del for per capirci); nello stessa versione la forma raccomandata del main prevede che restituisca un int (se si omette il return finale viene ritornato lo 0)
 
Si. Ma se non abiliti lo standard C99, il compilatore potrebbe dare errore.
Oppure come gcc viene gia di degault con std -std=gnu17
Metti che usi, che ne so, un compilatore keil C su 8051 probabilmente non te lo lascia fare. Tutto la.

Comunque in molte community opensource, si rispetta la regola delle variabili tutte a inizio scope. Anche nel kernel linux ad esempio, non puoi definire variabili qua e la.
Forse anche per leggibilita' del codice, o portabilita', o rimasto come regola come da vecchie versioni gcc.
 
Ultima modifica:
  • Mi piace
Reazioni: BAT
Stato
Discussione chiusa ad ulteriori risposte.
Pubblicità
Pubblicità
Indietro
Top