Είσοδος ακεραίων |
Το πρόγραμμα που βρίσκεται στο αρχείο INTIN.C δίνει παραδείγματα ανάγνωσης διαμορφωμένων δεδομένων. Το κύριο μέρος του προγράμματος αποτελείται από μία επανάληψη do-while που διαβάζει ακεραίους αριθμούς μέχρι να διαβάσει τον αριθμό 100. Η νέα συνάρτηση που χρησιμοποιείται είναι η scanf που μπορούμε να πόυμε οτι είναι το αντίστοιχο της printf γιά την είσοδο δεδομένων. Η printf εμφανίζει (στέλνει στην συσκευή stdio, δηλαδή στην οθόνη) τιμές μεταβλητών με βάση τη συμβολοσειρά ελέγχου και τη λίστα των ορισμάτων. Η λίστα των ορισμάτων αποτελείται από τα ονόματα των μεταβλητών και η συμβολοσειρά ελέγχου εξηγεί τη διαμόρφωση της εκτύπωσης. Αντίστοιχα η scanf διαβάζει (εισάγει από τη συσκευή stdin, δηλαδή από το πληκτρολόγιο) δεδομένα που εξηγούνται με βάση μιάν συμβολοσειρά ελέγχου και εκχωρούνται σε μεταβλητές με βάση τη λίστα ορισμάτων. Η δήλωση προτύπου της scanf είναι int scanf(char *format_string [,argument...]); όπου η τιμή που επιστρέφει η scanf δίνει τον αριθμό των επιτυχημένων αναγνώσεων, είναι 0 όταν η λίστα ορισμάτων είναι κενή και -1 όταν η εκτέλεση της συνάρτησης αποτύχει. Αυτό που πρέπει να τονιστεί ιδιαίτερα είναι οτι η λίστα ορισμάτων της scanf περιέχει διευθύνσεις μεταβλητών και όχι ονόματα μεταβλητών όπως στην printf. Η εξήγηση είναι προφανής: η printf εξάγει τιμές, άρα δέχεται παραμέτρους τιμής ενώ η scanf εισάγει τιμές, άρα πρέπει να δέχεται παραμέτρους αναφοράς. Ένα από τα πιό συνηθισμένα λάθη είναι η χρήση της scanf με απλά ονόματα αντί γιά διευθύνσεις. Να σημειώσουμε οτι η συνάρτηση scanf ανήκει στη βιβλιοθήκη STDIO, άρα εργάζεται με απομονωμένη είσοδο και ενεργοποιείται μόνο αν πατήσουμε το πλήκτρο Enter. Επιστρέφοντας στο πρόγραμμά μας βλέπουμε οτι αφού εισάγουμε κάποια δεδομένα και πιέσουμε το Enter η scanf θα σαρώσει τα περιεχόμενα του απομονωτή και θα ξεχωρίσει όσες συμβολοσειρές αποτελούν νόμιμη παράσταση ακέραιου αριθμού. Θα αγνοήσει κενά που προηγούνται και θα εμφανίσει τις ακέραιες τιμές όπως εκχωρούνται στη μεταβλητή valin., την καθε μία σε νέα σειρά, μέχρι κάποτε να εισάγουμε τον αριθμό 100 που τερματίζει το πρόγραμμα. Εάν υπάρχουν κάποια δεδομένα μετά την τιμή 100 τότε αγνοούνται. |
Πρέπει να είμαστε προσεκτικοί |
Η συνάρτηση scanf δουλεύει καλά και με αρνητικούς ακεραίους αλλά έχει προβλήματα αν παρεμβληθούν άλλοι χαρακτήρες. Αυτό βέβαια είναι δικό μας λάθος και θα έπρεπε να είμαστε προσεκτικοί. Ακόμη η συνάρτηση σαρώνει λάθος αριθμό εάν ο αριθμός που θέλουμε να εισάγουμε είναι εκτός των ορίων των ακεραίων αριθμών, δηλαδή μικρότερος του -32768 ή μεγαλύτερος του 32767. Και αυτό είναι δικό μας λάθος φυσικά γιατί ο αριθμός μας δεν μπορεί να αποθηκευτεί σε 2 bytes. Το σημαντικό είναι οτι γιά όλα αυτά τα λάθη το σύστημα εκτέλεσης του προγράμματος δεν προκαλεί διακοπή της εκτέλεσης. Έτσι το πρόγραμμα δείχνει να συνεχίζεται κανονικά, σε αντίθεση με άλλες γλώσσες που προειδοποιούν το χρήστη. Αυτό δείχνει ακόμη μιά φορά ο προγραμματισμός στη C πρέπει να είναι πολύ πιό προσεκτικός από οτι σε άλλες γλώσσες. |
![]() |
![]() |
![]() |