Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 13
  1. #1
    Utente di HTML.it
    Registrato dal
    Nov 2007
    Messaggi
    327

    [C] La getline non viene eseguita; perchè???

    Intanto buon anno a tutti!
    Ora, perchè la getline non mi funziona? Ovvero non mi permette di inserire niente?!?!
    codice:
    #include <stdio.h>
    int getline(char []);
    double atof (char[]);
    main()
    {
    int c;
    int k,a,s,b;
    char vettore[1000];
    printf("Premi a per un oggetto venduto come asta online");
    printf("\nPremi b per un oggetto venduto a compralo subito su ebay.it");
    printf("\nPremi c per un oggetto venduto come oggetto del negozio\n");
    
    if ((c=getchar())=='a'){
        printf("La tua selezione e' stata a\n");                    
        printf("inserisci il prezzo di vendita non comprensivo di spese di spedizione; \nEuro:");
        getline(vettore);
        k=atof(vettore);
            if (k <= 50){
                a=k/100;
                b=a*5.25;
                s=(k-b-2.5-1-5+4);
                printf("La tua parte inclusiva di spese di spedizione e': %d\n", s);    
                        }
                         }     
    system("pause");
    
    }
    int getline (char vettore[]){
    int c,i=0;                 
                                 while((c=getchar())!= '\n')
                                                       vettore [i++]=c; 
                                 if (c=='\n')
                                              vettore[i++]=c;
                                             
                                 vettore[i]= '\0';
                                 return i;
                                 }         
            
    double atof (char vettore[]){
    double val, power;
    int i, sign;
                                 for (i=0; isspace (vettore[i]); i++)
                                     ;
                                 sign = (vettore[i] == '-')? -1 : 1;
                                 if (vettore[i] == '+' || vettore[i] == '-')
                                    i++;
                                 for (val = 0.0; isdigit(vettore[i]); i++)
                                     val = 10.0 * val + (vettore[i] - '0');
                                 if (vettore[i] == '.')
                                    ;
                                 for (power = 1.0; isdigit (vettore[i]); i++)
                                                                             {
                                                                              val = 10.0 * val + (vettore[i] - '0');
                                                                              power *= 10.0;
                                                                             }
                    
                                 return sign * val / power;
                                }
    Grazie a chiunque mi vogli aiutare.

  2. #2
    In che senso "non mi consente di inserire niente"?
    Amaro C++, il gusto pieno dell'undefined behavior.

  3. #3
    Utente di HTML.it
    Registrato dal
    Nov 2007
    Messaggi
    327
    Si arriva al printf senza che getline mi chieda di inserire il numero

  4. #4
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284

    Re: [C] La getline non viene eseguita; perchè???

    Originariamente inviato da playbasfa
    Ora, perchè la getline non mi funziona? Ovvero non mi permette di inserire niente?!?!
    Ok, partiamo dal presupposto (che dovresti sapere) che le funzioni di I/O della libreria standard del C sono "bufferizzate".
    Quando usi getchar() essa giustamente ti ritorna 1 solo carattere. Ma prima che getchar() ritorni, devi premere anche invio. Non solo ... prima di premere invio potresti digitare qualunque altro carattere es:

    abcd <invio>

    solo a quel punto, getchar() ritorna la 'a' ma attenzione, tutto il resto (bcd + invio) rimane nel buffer!!!! Immagina cosa succede se subito dopo una cosa del genere, fai una getline ......
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  5. #5
    Utente di HTML.it
    Registrato dal
    Nov 2007
    Messaggi
    327

    Re: Re: [C] La getline non viene eseguita; perchè???

    Originariamente inviato da andbin
    Ok, partiamo dal presupposto (che dovresti sapere) che le funzioni di I/O della libreria standard del C sono "bufferizzate".
    Quando usi getchar() essa giustamente ti ritorna 1 solo carattere. Ma prima che getchar() ritorni, devi premere anche invio. Non solo ... prima di premere invio potresti digitare qualunque altro carattere es:

    abcd <invio>

    solo a quel punto, getchar() ritorna la 'a' ma attenzione, tutto il resto (bcd + invio) rimane nel buffer!!!! Immagina cosa succede se subito dopo una cosa del genere, fai una getline ......
    Scusa non ho capito.. intendi dire ge la getline non va bene? Io finora l'ho semrep utilizzata. L'unica differenza è che per la prima volta non la sto facendo dipendere da un ciclo.. solitamente usavo:
    Codice PHP:
    While ((getline())>0
    stavolta volevo fare in modo di adoperare la getline una sola volta..

  6. #6
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284

    Re: Re: Re: [C] La getline non viene eseguita; perchè???

    Originariamente inviato da playbasfa
    Scusa non ho capito.. intendi dire ge la getline non va bene?
    Vuol dire che quello che rimane nel buffer se lo "becca" direttamente la prossima funzione di input!!!
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  7. #7
    Utente di HTML.it
    Registrato dal
    Nov 2007
    Messaggi
    327

    Re: Re: Re: Re: [C] La getline non viene eseguita; perchè???

    Originariamente inviato da andbin
    Vuol dire che quello che rimane nel buffer se lo "becca" direttamente la prossima funzione di input!!!
    Ok, credo di aver capito cosa intendi, in pratica tu dici che siccome getchar viene eseguita solo quando io premo invio se io scrivessi prova[invio] la getcahr restituirebbe solo la "p" e rova rimarrebbe nel buffer.
    Se ho capito bene, non sono daccordo, credo infatti che la getchar venga eseguita ogni talvolta che si pigia un qualsiasi tasto; lo dico perchè tutti i programmi che ho "fatto" finora erano provvisti di questa identica funzione getline (presa dal libro);
    Io non riesco a capire perchè affinchè la getline mi dia anche solo la possibilitò di digitare un input (a presindere se poi questo benga frainteso o meno) questa deve essere inserita in un ciclo.
    In questo programma infatti, una volta fatta la selezione (a, b o c) il programma viene terminato senza farmi inserire nulla completamente da tastiera, ma viene stampato subito un risultato (ovviamente sbagliato perchè non avendo potuto inserire nulla chissa' cosa sarà stato convertito in numero)

  8. #8
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Evidentemente non sono ancora riuscito a farti capire cosa succede:

    codice:
    if ((c=getchar())=='a'){
        printf("La tua selezione e' stata a\n");                    
        printf("inserisci il prezzo di vendita non comprensivo di spese di spedizione; \nEuro:");
        getline(vettore);
        k=atof(vettore);
            if (k <= 50){
                a=k/100;
                b=a*5.25;
                s=(k-b-2.5-1-5+4);
                printf("La tua parte inclusiva di spese di spedizione e': %d\n", s);    
                        }
                         }     
    system("pause");
    
    }
    int getline (char vettore[]){
    int c,i=0;                 
                                 while((c=getchar())!= '\n')
                                                       vettore [i++]=c; 
                                 if (c=='\n')
                                              vettore[i++]=c;
    Nella prima getchar() all'inizio tu premi 'a' e poi <invio>. La 'a' ti viene ritornata ma <invio> rimane nel buffer.
    Poi entri nella tua getline(). C'è un ciclo while in cui prima di tutto, esegue una getchar() e quel <invio> rimasto nel buffer ti viene restituito. E si esce subito dal ciclo perché il carattere letto è '\n'.
    Nel if successivo la condizione è true perché c contiene appunto '\n' e quindi in vettore[i] scrivi un '\n'.

    Questo è quello che succede. Non è quello che volevi??? Allora cambia la gestione dell'input. Punto.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  9. #9
    Anche se il suo comportamento sui file in input non è standard, una
    codice:
    fflush(stdin);
    prima della chiamata a getline dovrebbe risolvere il tuo problema.
    Amaro C++, il gusto pieno dell'undefined behavior.

  10. #10
    Utente di HTML.it
    Registrato dal
    Nov 2007
    Messaggi
    327
    Originariamente inviato da MItaly
    Anche se il suo comportamento sui file in input non è standard, una
    codice:
    fflush(stdin);
    prima della chiamata a getline dovrebbe risolvere il tuo problema.
    Infatti l'ha risolto.. grazie mille.

    P.s.
    Perchè se faccio dopo la getline e l'atof:
    codice:
    if (k>=0){
        a=(k/100);
        printf("%f",a);
    mi viene stampato 0??

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 © 2025 vBulletin Solutions, Inc. All rights reserved.