Visualizzazione dei risultati da 1 a 10 su 10
  1. #1

    [C] problemi con getchar

    Salve a tutti.

    Il mio intento era di creare un programma che prendesse in input:
    1)due numeri;
    2)l'operatore;
    ed eseguisse l'operazione corrispondente.

    Utilizzando la scanf per memorizzare l'operatore ho avuto dei problemi; utilizzando la getchar idem. In entrambi i casi infatti, il programma non attendeva l'inserimento da tastiera dell'operatore ma terminava l'esecuzione come se io avessi inserito un carattere non valido.
    Perché? [So che non conviene utilizzare la scanf per prendere valori in input..ma vorrei comunque capirne il funzionamento].

    codice:
    #include<stdio.h> 
    int main(){ 
    printf("type 2 numbers\n"); 
    int a,b; 
    char car=' '; 
    scanf("%d %d ", &a, &b); 
    printf("Insert the operator\n"); 
    while((car=='\n')|(car=='\t')|(car=='\n')|(car=' ')) 
    car=getchar(); 
    switch(car){ 
    case '+': printf("a+b= %d",a+b); break; 
    case '-': printf("a-b= %d",a-b); break; 
    case '*': printf("a*b=%d",a*b); break; 
    case '/': printf("a:b=%d",a/b); break; 
    default : printf("the requested operation is not valid"); 
    return -1; } 
    return 0; }
    Grazie per l'aiuto!

  2. #2
    Utente di HTML.it
    Registrato dal
    Mar 2006
    Messaggi
    93
    Ciao,

    forse il problema è dovuto a questo: tu scrivi 2 numeri e premi invio. La scanf legge i due numeri ma nello standard input resta ancora l'invio ('\n') che hai dato.
    Dopo la scanf aggiungi "fflush(stdin)" così da ripulire il buffer di input.

    p.s. nel while chredo che tu voglia fare un OR logico ( || ) non un OR bit a bit ( | ) come hai scritto

  3. #3
    Purtroppo non va neanche così:

    codice:
    #include<stdio.h> 
    int main(){ 
    printf("type 2 numbers\n"); 
    int a,b; 
    char car=' '; 
    scanf("%d %d", &a, &b); 
    fflush(stdin); 
    while((car=='\n')||(car=='\t')||(car=' ')){ 
    printf("Insert the operator\n"); 
    scanf("%c",&car); } 
    switch(car){ 
    case '+': printf("a+b= %d",a+b); break; 
    case '-': printf("a-b= %d",a-b); break; 
    case '*': printf("a*b=%d",a*b); break; 
    case '/': printf("a:b=%d",a/b); break; 
    default : printf("the requested operation is not valid");
     return -1; } 
    return 0; }
    spero non sia un problema del mio compilatore, ma solo della mia testa!

  4. #4
    Utente di HTML.it
    Registrato dal
    Mar 2006
    Messaggi
    93
    e se sostituisci "fflush(stdin)" con "getchar()"?

  5. #5
    Utente di HTML.it
    Registrato dal
    Mar 2006
    Messaggi
    93
    ed anche un'altra cosa:
    codice:
    while( car!='+' && car!='-' && car!='/' && car!='*')

  6. #6
    Perfetto..ora funziona!
    Abbiamo utilizzato getchar() come raccoglitore di immondizia..ottima idea

    Grazie mille!

  7. #7
    Utente di HTML.it
    Registrato dal
    Mar 2006
    Messaggi
    93
    Pare che la funzione fflush non funzioni bene su Linux con stdin...ho trovato in giro che alcuni consigliano di usare:
    codice:
    scanf("%*s");
    Ma spero che qualcuno del forum possa illuminarci

  8. #8
    Utente di HTML.it
    Registrato dal
    Jul 2008
    Messaggi
    1,327
    Non è un problema di Linux o di altri sistemi, semplicemente non c'è nessuna garanzia che fflush(stdin) faccia quello che ci si aspetta. Come descritto nello standard infatti:

    If stream points to an output stream or an update stream in which the most recent
    operation was not input, the fflush function causes any unwritten data for that stream
    to be delivered to the host environment to be written to the file; otherwise, the behavior is
    undefined.
    l' "otherwise" ovviamente comprende anche il caso il cui il file stream sia lo stdin. Insomma la fflush() richiamata su stdin ha un comportamento indefinito ("undefined behavior"), ragione per la quale con alcuni compilatori può sortire l'effetto di rilasciare caratteri bufferizzati nello stream di input (di fatto similmente a quello che succede con quelli di output) mentre con altri può anche semplicemente non fare nulla. Per citare Peter van der Linden:

    undefined — The behavior for something incorrect, on which the standard does not impose any requirements. Anything is allowed to happen, from nothing, to a warning message to program termination, to CPU meltdown, to launching nuclear missiles (assuming you have the correct hardware option installed).
    quindi attenzione a non provocare guerre nucleari.
    every day above ground is a good one

  9. #9
    Utente di HTML.it
    Registrato dal
    Mar 2006
    Messaggi
    93
    Grazie!

  10. #10
    Grande Peter!

    Grazie a tutti!

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2020 vBulletin Solutions, Inc. All rights reserved.