Δημοσιεύτηκε: 28 Ιούλ 2011, 15:30
migf1 έγραψε:Star_Light έγραψε:Δηλαδη για να καταλαβω ας πουμε... υπαρχει προβλημα με την getchar εκτος και αν βαλεις σε περιβαλλον windows πριν απο αυτην ενα fflush(stdin) ?
Και στον Γκιουρδα μεσα δεν αναφερει τιποτα για αυτο.... ολοκληρο βιβλιο!
Και όχι μόνο με την getchar() (getc() και fgetc() ) αλλά και με την scanf(). Το πρόβλημα παρουσιάζεται όταν ο χρήστης (είτε κατά λάθος είτε επίτηδες) πληκτρολογήσει στην είσοδο περισσότερα πράγματα από ότι περιμένουμε να διαβάσουμε. Τα έξτρα αυτά πράματα παραμένουν στο buffer της εισόδου με αποτέλεσμα το επόμενο scanf (getchar, κλπ) του προγράμματός μας αντί να διαβάσει φρέσκο πράμα από τον χρήστη, διαβάζει αυτόματα τα έξτρα πράματα από την προηγούμενη είσοδο. Το fflush(stdin) σε Windows αυτό που κάνει είναι να καθαρίζει τελείως το buffer, οπότε καλώντας το πριν από κάθε scanf (getchar, κλπ) εξασφαλίζουμε πως θα διαβάσουμε φρέσκο πράμα από τον χρήστη. Μόνο που η fflush(stdin) δεν λειτουργεί σε περιβάλλον gcc/unix/linux.
Πέρα όμως από το παραπάνω, αυτό που έχει μεγαλύτερη σημασία είναι ότι μάθαμε πως να μετατρέπουμε strings σε αριθμούς, κάτι που χρησιμοποιείται κατά κόρον σε όλα τα GUI, γιατί εκεί δεν διαβάζεις με τις στάνταρ συναρτήσεις εισόδου της C. Τα GUI έχουν δική τους συνάρτηση διαβάσματος και κατά συντριπτική πλειοψηφία διαβάζουν τα πάντα ως strings (συνήθως μέσα από πεδία κειμένου σε γραφικές φόρμες) οπότε πρέπει να ξέρουμε πως να τα μετατρέπουμε σε αριθμούς εμείς όταν χρειαστεί.
Και τώρα που το σκέφτομαι, τον 3ο τρόπο λύσης της προηγούμενης άσκησης δεν θα τον γράψω όπως είχα σκεφτεί, δηλαδή με στόχο να δείξω διαφορετική χρήση των συναρτήσεων get_, αλλά θα τον κάνω με χρήση της συνάρτησης sscanf() που δουλεύει σαν την scanf() αλλά αντί να διαβάζει από την κύρια είσοδο, διαβάζει από ένα string (στη δική μας περίπτωση θα είναι το: inbuf που θα το έχουμε διαβάσει πρώτα κλασικά με την s_get εδώ πέρα, γιατί είμαστε σε κονσόλα.... αν ήμασταν σε GUI, αντί για την s_get θα χρησιμοποιούσαμε την αντίστοιχη του GUI).
Κατσε ομως... εγω στον παρακατω κωδικα δεν πληκτρολογησα κατι παραπανω... εναν χαρακτηρα την φορα δινω
- Κώδικας: Επιλογή όλων
#include<stdio.h>
int main()
{
char x;
int i;
for(i=0; i<4; i++)
{
printf("Dwste enan xaraktira\n");
x=getchar();
putchar(x);
}
return 0;
}
και μου το εμφανιζει 2 φορες ας πουμε :/