PDA

Visualizza la versione completa : [C] La getline non viene eseguita; perchè???


playbasfa
01-01-2008, 19:43
Intanto buon anno a tutti!
Ora, perchè la getline non mi funziona? Ovvero non mi permette di inserire niente?!?!


#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.

MItaly
01-01-2008, 20:46
In che senso "non mi consente di inserire niente"?

playbasfa
01-01-2008, 21:29
Si arriva al printf senza che getline mi chieda di inserire il numero

andbin
01-01-2008, 22:42
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 ......

playbasfa
01-01-2008, 22:58
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:


While ((getline())>0)

stavolta volevo fare in modo di adoperare la getline una sola volta..

andbin
01-01-2008, 23:09
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!!!

playbasfa
01-01-2008, 23:35
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)

andbin
02-01-2008, 09:39
Evidentemente non sono ancora riuscito a farti capire cosa succede:


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.

MItaly
02-01-2008, 16:53
Anche se il suo comportamento sui file in input non è standard, una


fflush(stdin);

prima della chiamata a getline dovrebbe risolvere il tuo problema.

playbasfa
02-01-2008, 21:10
Originariamente inviato da MItaly
Anche se il suo comportamento sui file in input non è standard, una


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:


if (k>=0){
a=(k/100);
printf("%f",a);


mi viene stampato 0??

Loading