Domanda Risolto Problema con l output in C

Bananasmixer

Utente Iron
21 Agosto 2019
20
5
0
19
Salve a tutti,
ho scritto una codice per la somma di numeri interi ma quando vado a compilare e ad eseguire il file.exe mi da in input le 2 voci da sommare ma non mi da in output il risultato...
Avevo già riscontrato questo tipo di problema con l output di una semplice frase ma avevo risolto inserendo getchar() ma con questo mio nuovo programma non funge
C:
#include <stdio.h>

int main(void)  {
    int A;
    int B;
    int C;
    printf("Scrivi il primo numero intero da sommare \n");
    scanf("%d", &A) ;
    printf("Scrivi il secondo numero intero da sommare \n");
    scanf("%d", &B) ;
    C=A+B ;
    printf("La somma è %d", C) ;
    getchar();

}

Mi potete scrivere il codice corretto?
 
Ciao @Bananasmixer,

attenzione alle variabili non inizializzate. La variabile C non è stata inizializzata e perciò avrà un valore random. Per questo motivo non è corretto.

Essendo una funziona somma, alla variabile C dovrai assegnare il valore 0.
Quindi
C:
int C = 0;

Basta questo, il resto mi sembra giusto.

MP
 
Ciao @Bananasmixer,

attenzione alle variabili non inizializzate. La variabile C non è stata inizializzata e perciò avrà un valore random. Per questo motivo non è corretto.

Essendo una funziona somma, alla variabile C dovrai assegnare il valore 0.
Quindi
C:
int C = 0;

Basta questo, il resto mi sembra giusto.

MP
ho provato ma il programma si chiude sempre prima di visualizzare l output nonostante ciò ho risolto facendo in questo modo:
C:
#include <stdio.h>

int main(void)  {
    int A;
    int B;
    int C;
    printf("Scrivi il primo numero intero da sommare \n");
    scanf("%d", &A);
    printf("Scrivi il secondo numero intero da sommare \n");
    scanf("%d", &B);
    C=A+B;
    printf("La somma e' %d \n", C);
    system ("PAUSE");

}
 
Trovi scritta sia la soluzione che il problema.
 
  • Mi piace
Reazioni: 0xbro
Trovi scritta sia la soluzione che il problema.
Avevo visto e testato in diversi casi ma in alcuni casi mi funzionava e in altri no...quindi ho cercato un altra risoluzione del problema e mi sono imbattuto nella seguente funzione che per ora non mi sta dando problemi...
Codice:
getch()
 
I programmi senza interfaccia grafica si aprono da terminale (powershell o cmd se sei su windows), non con doppio click. Quel getch() è una cosa di conio.h, che è una libreria non standard (windows only) si usava ai tempi di MS-DOS, la bellezza di 30 anni fa. Dimenticatela. Comunque vabbé... I give you what you want.
C:
#include <stdio.h>

int main(void)  {
    int A;
    int B;
    int C;
    printf("Scrivi il primo numero intero da sommare \n");
    scanf("%d", &A) ;
    printf("Scrivi il secondo numero intero da sommare \n");
    scanf("%d", &B) ;
    C=A+B ;
    printf("La somma è %d", C) ;
 
    int c;
    while ((c = getchar()) != '\n' && c != EOF);  /* flusha il buffer stdin */
    getchar();  /* resta in attesa della pressione di un tasto (prendi in input un carattere) */

    return 0;
}

Ti faccio notare che quel codice che ho scritto lo trovi proprio nella discussione (in rilievo) che ti ho linkato prima assieme alla spiegazione del problema e del perché si presenta.
 
Ciao @Bananasmixer,

attenzione alle variabili non inizializzate. La variabile C non è stata inizializzata e perciò avrà un valore random. Per questo motivo non è corretto.

Essendo una funziona somma, alla variabile C dovrai assegnare il valore 0.
Quindi
C:
int C = 0;

Basta questo, il resto mi sembra giusto.

MP
Non credo che questo sia un problema. Alla fine assegna a C la somma di A e B. Anche se C all'inizio vale qualcosa random non importa.
 
Ultima modifica:
Ti faccio notare che quel codice che ho scritto lo trovi proprio nella discussione (in rilievo) che ti ho linkato prima assieme alla spiegazione del problema e del perché si presenta.
Ho letto la discussione ma non c ho capito tanto...
Comunque vabbé... I give you what you want.
C:
#include <stdio.h>

int main(void)  {
    int A;
    int B;
    int C;
    printf("Scrivi il primo numero intero da sommare \n");
    scanf("%d", &A) ;
    printf("Scrivi il secondo numero intero da sommare \n");
    scanf("%d", &B) ;
    C=A+B ;
    printf("La somma è %d", C) ;

    int c;
    while ((c = getchar()) != '\n' && c != EOF);  /* flusha il buffer stdin */
    getchar();  /* resta in attesa della pressione di un tasto (prendi in input un carattere) */

    return 0;
}
Ti faccio notare che quel codice che ho scritto lo trovi proprio nella discussione (in rilievo) che ti ho linkato prima assieme alla spiegazione del problema e del perché si presenta.

Va bene ora funziona pero ho provato ad utilizzare la stessa funzione in un altro programma ma mi restituisce lo stesso problema nonostante abbia messo quella porzione di codice:
C:
#include <stdio.h>
int main (void) {
    int N;
    int A;
    int B;
    printf("inserisci un numero da 1 a 20 \n");
    scanf("%d",&N);

 
    if (N>=1 && N<=20) {
        A=N ;
        B=N ;
        while (N!=0) {
            printf("\n");
            while (A!=0) {
                printf("*");
                A=A-1;
         
            }
            N=N-1;
            A=B;
        }
    }
    else {
        printf("Errore! Il numero che hai inserito non e' compreso tra 1 e 20 \n");
               
        }
    int c;
    while ((c = getchar()) != '\n' && c != EOF);
    }
Questo codice, da come potete dedurre, crea un quadrato di asterischi ma facendo in questo modo non funziona!
 
Ultima modifica:
C:
#include <stdio.h>

int main(void) {
int A;
int B;
int C;
printf("Scrivi il primo numero intero da sommare \n");
scanf("%d", &A) ;
printf("Scrivi il secondo numero intero da sommare \n");
scanf("%d", &B) ;
C=A+B ;
printf("La somma è %d", C) ;

int c;
while ((c = getchar()) != '\n' && c != EOF); /* flusha il buffer stdin */
getchar(); /* resta in attesa della pressione di un tasto (prendi in input un carattere) */

return 0;
}

Ok perfetto grazie mille ho risolto
Messaggio unito automaticamente:

int c; while ((c = getchar()) != '\n' && c != EOF); /* flusha il buffer stdin */
getchar(); /* resta in attesa della pressione di un tasto (prendi in input un carattere) */
mi puoi spiegare in modo più semplice "flusha il buffer stdin"

ps:come ho gia detto ho letto la discussione che hai scritto ma non sono riuscito a capirci molto..
 
Va bene ora funziona pero ho provato ad utilizzare la stessa funzione in un altro programma ma mi restituisce lo stesso problema nonostante abbia messo quella porzione di codice:
Perché non hai aggiunto quella porzione di codice. Le righe che devi aggiungere sono una o due (più, in caso servisse, una terza riga per dichiarare la variabile) e sono queste:
C:
/* while ((c = getchar()) != '\n' && c != EOF);  */ /* flusha il buffer stdin */
getchar();  /* resta in attesa della pressione di un tasto (prendi in input un carattere) */
La prima riga serve per flushare il buffer stdin e l'hai scritta (assieme alla riga per dichiarare la variabile c). La seconda riga, il getchar() che serve per rimanere in attesa della pressione di un tasto, nel tuo codice non c'è. Non funziona perché hai copiato male... o perché non hai capito cosa stavi copiando.
In generale la rule of thumbs è:
  1. il getchar() serve sempre, perché quello che vuoi ottenere è "resta in attesa della pressione di un tasto";
  2. il while loop (da decommentare!) essenzialmente vuoto (eventualmente con la dichiarazione della variabile c) che "flusha il buffer stdin" va scritto (prima del getchar) solo in caso in cui ci sia della sporcizia nel buffer stdin. Come fai a sapere se c'è sporcizia nel buffer stdin? Puoi semplicemente controllare se il getchar da solo ti da l'effetto sperato.
In inglese "to flush" significa sciacquare o meglio, in questo caso, svuotare. Quando quello che scrive l'utente, i dati vengono immagazzinati tutti assieme (memorizzati in quello che sostanzialmente è un array) e poi processati tutti in un colpo. Se hai una scanf con %d (leggi un intero) e l'untente inserisce "123piripicchio", parte del testo inserito rimarrà nel buffer stdin. La prossima volta che chiami una funzione per prendere l'input dall'utente, il tuo programma si accorge che hai ancora parte dell'input precedente da processare e lo usa. Potrebbe essere quello che vuoi, ma nel tuo caso non è così. Ragionevolmente, la funzione per leggere l'input (scanf o getchar che sia) non butta via niente. Se vuoi svuotare il buffer stdin devi usare quel while.
Svuotare (to flush) il buffer stdin non significa rimanere in attesa di un input dall'utente, ma significa cancellare il contenuto che è già presente. Non c'è un modo pulito per farlo, quindi devi usare quel truccaccio del while che va messo solo quando c'è effettivamente sporcizia nel buffer. Nella guida in rilievo dovresti leggere sia il punto "Quando avvio l'eseguibile non vedo niente, anche se il programma è corretto. Dove sbaglio?" che il punto " L'input non funziona correttamente, l'utente non ha la possibilità di inserirlo. C'è della sporcizia nel buffer stdin.", ma onestamente ti consiglio di leggerla tutta. Se l'ho scritta è perché, dopo aver letto diverse domande in questa sezione, la reputavo utile.
 
  • Mi piace
Reazioni: MichPower