Scanf s c περιγραφή. Μορφοποιημένη είσοδος και έξοδος. Χρησιμοποιώντας κανονικά σύμβολα

] SCANF #include int scanf(format-string[[, όρισμα...]]); char *format-string. συμβολοσειρά ελέγχου μορφής. Περιγραφή. Η συνάρτηση scanf διαβάζει δεδομένα από το stdin στη θέση που καθορίζεται από ορίσματα. Κάθε όρισμα πρέπει να είναι δείκτης σε μια τιμή με τύπο που ταιριάζει με τον τύπο που καθορίζεται στη συμβολοσειρά μορφοποίησης. Η συμβολοσειρά μορφοποίησης ελέγχει τον μετασχηματισμό των πεδίων εισόδου. Αυτή η συμβολοσειρά μπορεί να περιέχει τα ακόλουθα: χαρακτήρες "Whitespace", π.χ. χαρακτήρας διαστήματος " ", καρτέλα \t, νέα γραμμή "\n". Για τη συνάρτηση scanf, ο χαρακτήρας διαστήματος καθορίζει ότι όλοι οι επόμενοι χαρακτήρες διαστήματος που εισάγονται, μέχρι τον πρώτο χαρακτήρα χωρίς διαστήματα, διαβάζονται, αλλά δεν αποθηκεύονται. Καθώς πληκτρολογείτε, ένας μεμονωμένος χαρακτήρας διαστήματος στη συμβολοσειρά μορφής ταιριάζει με οποιονδήποτε αριθμό, συμπεριλαμβανομένου του 0, ή οποιονδήποτε συνδυασμό χαρακτήρων διαστήματος. Οποιοσδήποτε χαρακτήρας ελέγχου που δεν είναι χαρακτήρας διαστήματος ή σύμβολο ποσοστού. Στη συνέχεια, χρησιμοποιώντας αυτό το σύμβολο, διαβάζεται η λειτουργία σάρωσης, χωρίς όμως να αποθηκεύονται τα αντίστοιχα σύμβολα ελέγχου. Αν ο επόμενος χαρακτήρας είναι δεν ταιριάζει με χαρακτήρες ελέγχου, το scanf τερματίζει την εργασία του. Η προδιαγραφή μορφής, εισάγεται με το σύμβολο %. Σε αυτήν την περίπτωση, το scanf διαβάζει και μετατρέπει τους εισαγόμενους χαρακτήρες σε τιμές του συγκεκριμένου τύπου, με τις τιμές να καθορίζονται από τα αντίστοιχα ορίσματα από τη λίστα ορισμάτων. Η συμβολοσειρά μορφοποίησης διαβάζεται από αριστερά προς τα δεξιά. Οι χαρακτήρες εκτός των προδιαγραφών μορφής θεωρείται ότι ταιριάζουν με την ακολουθία χαρακτήρων στο stdin. Αυτοί οι αντιστοιχισμένοι χαρακτήρες στο stdin σαρώνονται αλλά δεν απομνημονεύονται. Εάν ένας χαρακτήρας στο stdin έρχεται σε διένεξη με τη συμβολοσειρά μορφοποίησης, το scanf τερματίζεται. Αυτός ο αντικρουόμενος χαρακτήρας παραμένει στο stdin επειδή δεν μπορεί να διαβαστεί. Όταν συναντήσετε την πρώτη προδιαγραφή μορφής, τότε η τιμή του πρώτου πεδίου εισαγωγής μετατρέπεται σύμφωνα με την προδιαγραφή μορφής και αποθηκεύεται στη θέση που καθορίζεται από το πρώτο όρισμα. Σύμφωνα με τη δεύτερη προδιαγραφή μορφής, το δεύτερο πεδίο εισαγωγής μετατρέπεται και αποθηκεύεται από το δεύτερο όρισμα. και ούτω καθεξής μέχρι το τέλος της γραμμής μορφοποίησης. Το πεδίο εισαγωγής περιορίζεται στον πρώτο χαρακτήρα "λευκό διάστημα" ή στον πρώτο χαρακτήρα που δεν μπορεί να μετατραπεί στην καθορισμένη μορφή ή όταν φτάσει το πεδίο πλάτους, το οποίο έρχεται πρώτο. Εάν η επιλεγμένη προδιαγραφή μορφής έχει περισσότερα ορίσματα από τα απαιτούμενα, τα επιπλέον ορίσματα αγνοούνται. Η προδιαγραφή μορφής έχει την ακόλουθη μορφή. % <.precision><{F:N:h:I}> . Κάθε πεδίο στη μορφή προδιαγραφών είναι ένας ξεχωριστός χαρακτήρας ή αριθμός που εκφράζει μια διαφορετική επιλογή μορφής. Ο χαρακτήρας τύπου που εμφανίζεται μετά το τελευταίο προαιρετικό πεδίο μορφής καθορίζει τον τύπο του πεδίου εισαγωγής ως χαρακτήρα, συμβολοσειρά ή αριθμητικό. Η απλούστερη μορφή προδιαγραφών περιέχει μόνο τον χαρακτήρα σύμβολο ποσοστού και τον χαρακτήρα τύπου (για παράδειγμα, %S). Κάθε πεδίο προδιαγραφής μορφής περιγράφεται παρακάτω. Εάν ένα σύμβολο % ακολουθείται από έναν χαρακτήρα που δεν είναι χαρακτήρας ελέγχου μορφής, τότε αυτός ο χαρακτήρας και οι χαρακτήρες που τον ακολουθούν, μέχρι το επόμενο σύμβολο %, αντιμετωπίζονται ως κανονική ακολουθία χαρακτήρων, π.χ. ακολουθία που πρέπει να εισαχθεί. Για παράδειγμα, για να εισαγάγετε τον χαρακτήρα σύμβολο %, χρησιμοποιήστε το %%. Ένας αστερίσκος (*) που ακολουθεί το σύμβολο % καταστέλλει τον προσδιορισμό του επόμενου πεδίου εισαγωγής, που καθορίζεται ως πεδίο που ορίζεται ανά τύπο. Αυτό το πεδίο σαρώνεται αλλά δεν απομνημονεύεται. Το Widht είναι ένας θετικός δεκαδικός ακέραιος και ελέγχει τον μέγιστο δυνατό αριθμό χαρακτήρων που διαβάζονται από το stdin. Μόνο οι χαρακτήρες που δεν υπερβαίνουν το πλάτος μετατρέπονται και αποθηκεύονται με το αντίστοιχο όρισμα. Εάν το πλάτος περιέχει χαρακτήρες "κενού χώρου", π.χ. διαστήματα, καρτέλες ή νέες γραμμές, δεν μετατρέπονται στην επιλεγμένη μορφή μέχρι να επιτευχθεί το πλάτος. Τα προαιρετικά προθέματα F και N δεν τηρούν την προεπιλεγμένη σύμβαση διευθυνσιοδότησης των μοντέλων μνήμης που χρησιμοποιούνται. Το F μπορεί να είναι ένα πρόθεμα σε όρισμα που δείχνει ένα μακρινό αντικείμενο. και Ν - στο κοντινό αντικείμενο. Το προαιρετικό πρόθεμα l υποδεικνύει ότι χρησιμοποιείται η μεγάλη έκδοση. και το πρόθεμα h υποδηλώνει τη χρήση της σύντομης έκδοσης. Το αντίστοιχο όρισμα δείχνει ένα μακρύ ή διπλό αντικείμενο (χρησιμοποιώντας το πρόθεμα l) ή ένα μικρό αντικείμενο (χρησιμοποιώντας το πρόθεμα h). Οι τροποποιητές l και h μπορούν να χρησιμοποιηθούν σε συνδυασμό με τους τύπους χαρακτήρων d, i, o, x, u. Ο τροποποιητής l μπορεί επίσης να χρησιμοποιηθεί με χαρακτήρες τύπου e και f. Εάν καθορίζεται οποιοσδήποτε άλλος τύπος, οι τροποποιητές l και h αγνοούνται. Τα σύμβολα τύπου και οι σημασίες τους περιγράφονται στον Πίνακα R.4. Πίνακας R.4 Τύποι χαρακτήρων σάρωσης ΣΥΜΒΟΛΟ ΠΡΟΟΡΙΖΟΜΕΝΟΣ ΤΥΠΟΣ ΕΙΣΑΓΩΓΗ ΟΡΙΣΜΑ ΤΥΠΟΣ d δεκαδικός ακέραιος δείκτης προς int. Δ δεκαδικός ακέραιος δείκτης προς long. o οκταδικός ακέραιος δείκτης προς int. O οκταδικός ακέραιος δείκτης προς μακρύ. x δεκαεξαδικός δείκτης σε ενθ. ακέραιος Χ δεκαεξαδικός δείκτης προς μακρύ. ακέραιος i δεκαδικός, το oc είναι δείκτης στο int. meric ή δεκαεξαδικός ακέραιος I δεκαδικός, οκταδικός δείκτης προς μακρύ. μετρικός ή δεκαεξαδικός ακέραιος u ανυπόγραφος δεκαδικός δείκτης σε ανυπόγραφο δεκαδικό ακέραιο int. U ανυπόγραφο δεκαδικό δείκτη σε έναν ανυπόγραφο ακέραιο μήκος. e δείκτης float σε έναν float f που περιέχει ένα προαιρετικό πρόσημο ("+", "-"), ένα ή περισσότερα δεκαδικά ψηφία, που συνήθως περιέχουν μια υποδιαστολή και έναν εκθέτη ("e ", "E"), ο οποίος γράφεται μετά το υπογεγραμμένη ακέραια τιμή. Το γ είναι συμβολικό. Δείκτης στους χαρακτήρες: το διάστημα, η καρτέλα ή η νέα γραμμή, οι λεγόμενοι χαρακτήρες "κενού χώρου", οι οποίοι συνήθως αγνοούνται, διαβάζονται όταν καθορίζεται αυτός ο τύπος. Για να διαβάσετε τον επόμενο χαρακτήρα χωρίς κενά, χρησιμοποιήστε τον συνδυασμό %1s. s χορδή. Ένας δείκτης σε έναν πίνακα χαρακτήρων αρκετά μεγάλο για το πεδίο εισαγωγής, με τον μηδενικό τερματικό χαρακτήρα "\0" να εμφανίζεται αυτόματα. n ανάγνωση κατά την εισαγωγή δείκτη σε int, in from stream ή στην οποία είναι γραμμένο το buffer δεν συμβαίνει, ο αριθμός διαβάζεται με επιτυχία. χαρακτήρες δεδομένων από τη ροή ή την προσωρινή μνήμη, μέχρι αυτούς που καθορίζονται στην κλήση σάρωσης. τιμή p στον δείκτη φόρμας προς το far- xxxx: εεεε, πού είναι η ομάδα δεδομένων. Τα ψηφία x και y είναι κεφαλαία δεκαεξαδικά ψηφία. Κατά την ανάγνωση συμβολοσειρών που δεν οριοθετούνται από κενά, το σύνολο χαρακτήρων σε αγκύλες πρέπει να αντικατασταθεί με τον τύπο συμβολοσειράς s. Το αντίστοιχο πεδίο εισαγωγής διαβάζεται μέχρι τον πρώτο χαρακτήρα που δεν περιέχεται στο σύνολο χαρακτήρων που περιορίζεται σε αγκύλες. Εάν ο πρώτος χαρακτήρας σε αυτό το σύνολο είναι caret (^), το αποτέλεσμα αποθηκεύεται: το πεδίο εισαγωγής διαβάζεται μέχρι τον πρώτο χαρακτήρα που δεν περιλαμβάνεται σε αυτό το σύνολο χαρακτήρων. Για να θυμάστε μια συμβολοσειρά χωρίς τον μηδενικό χαρακτήρα "\0", χρησιμοποιείται η προδιαγραφή %nc, όπου n είναι ένας δεκαδικός ακέραιος. Σε αυτήν την περίπτωση, ο τύπος χαρακτήρα s ορίζει ένα όρισμα που οδηγεί σε έναν πίνακα χαρακτήρων. Οι επόμενοι n χαρακτήρες διαβάζονται από τη ροή εισόδου σε μια συγκεκριμένη θέση και ο μηδενικός χαρακτήρας δεν γράφεται. Η λειτουργία scanf σαρώνει κάθε πεδίο εισαγωγής χαρακτήρα ανά χαρακτήρα. Μπορεί να σταματήσει την ανάγνωση ενός μεμονωμένου πεδίου όταν φτάσει σε ένα χαρακτήρα διαστήματος εάν επιτευχθεί είτε το πεδίο πλάτους. ή ο επόμενος χαρακτήρας εισόδου δεν μπορεί να μετατραπεί σύμφωνα με την καθορισμένη μορφή. Ή ο επόμενος χαρακτήρας έρχεται σε διένεξη με τον αντίστοιχο χαρακτήρα στη συμβολοσειρά ελέγχου μορφής. ή ο επόμενος χαρακτήρας δεν βρίσκεται στο επιλεγμένο σύνολο χαρακτήρων. Όταν εμφανίζεται μια αναγκαστική διαδικασία τέλους ανάγνωσης, το επόμενο πεδίο εισαγωγής εξετάζεται από τον πρώτο κιόλας αντικρουόμενο χαρακτήρα. Αυτός ο χαρακτήρας, εάν υπάρχει, αντιμετωπίζεται ως μη αναγνωσμένος, είτε ως ο πρώτος χαρακτήρας του επόμενου πεδίου εισαγωγής είτε ως ο πρώτος χαρακτήρας σε επόμενες αναγνώσεις από το stdin. Επιστρεφόμενη αξία. Αυτή η συνάρτηση επιστρέφει τον αριθμό των πεδίων που έχουν μετατραπεί και εκχωρηθεί με επιτυχία. Η τιμή επιστροφής δεν περιλαμβάνει τον αριθμό των πεδίων που διαβάστηκαν αλλά δεν έχουν εκχωρηθεί. Προσπάθεια ανάγνωσης του τέλους του αρχείου επιστρέφει ΕΟΦ. Η επιστρεφόμενη τιμή 0 υποδηλώνει ότι δεν έχουν εκχωρηθεί πεδία. Δείτε επίσης fscanf, printf, sscanf, vfprintf, vprintf, vsprintf. Παράδειγμα 1. #include int i? float fp? char c, s; scanf("%d %f %c %s", &i, &fp, &c, s); /* εισαγωγή διαφόρων δεδομένων */. Παράδειγμα 2. #include main () /* μετατροπή δεκαεξαδικού ** ή οκταδικού ακέραιου σε ** δεκαδικού ακέραιου */ ( int numassigned, val; pintf("Enter hexadecimal or octal #, or 00 to guit:\n"); do ( printf("# = "); numassigned = scanf("%i", &val); printf("Decimal # = %i\n", nal); ) while (val && numassigned); /* τέλος του βρόχου εάν η τιμή εισόδου είναι 00, ή αν το scanf δεν μπορεί να εκχωρήσει το πεδίο */ ) Τότε η έξοδος θα είναι η εξής. Εισαγάγετε δεκαεξαδικό ή οκταδικό #, ή 00 για να γράψετε: # = 0xf Δεκαδικό # = 15 # = 0100 Δεκαδικό # = 64 # = 00 Δεκαδικό # = 0.

Η λειτουργία printf() σάς επιτρέπει να εμφανίζετε πληροφορίες στην οθόνη κατά τον προγραμματισμό σε λειτουργία κονσόλας. Αυτή η συνάρτηση ορίζεται στη βιβλιοθήκη stdio.h και έχει την ακόλουθη σύνταξη:

int printf(const char *format [, όρισμα]...);

Εδώ, το πρώτο όρισμα *format καθορίζει μια συμβολοσειρά που εκτυπώνεται στην οθόνη και μπορεί να περιέχει ειδικούς χαρακτήρες ελέγχου για την έξοδο μεταβλητών. Αυτό ακολουθείται από μια λίστα προαιρετικών ορισμάτων, τα οποία επεξηγούνται παρακάτω. Η συνάρτηση επιστρέφει είτε τον αριθμό των χαρακτήρων που εμφανίζονται είτε έναν αρνητικό αριθμό εάν δεν λειτουργεί σωστά.

Στην απλούστερη εφαρμογή της, η συνάρτηση printf() απλώς εκτυπώνει τη δεδομένη συμβολοσειρά στην οθόνη της οθόνης:

printf("Γεια σου κόσμο.");

Ωστόσο, μπορεί να χρησιμοποιηθεί για την εμφάνιση μεταβλητών διαφορετικών τύπων: από αριθμητική έως συμβολοσειρά. Για την εκτέλεση αυτής της λειτουργίας, χρησιμοποιούνται ειδικοί χαρακτήρες ελέγχου που ονομάζονται specifiers, οι οποίοι ξεκινούν με τον χαρακτήρα %. Το ακόλουθο παράδειγμα δείχνει την έξοδο της ακέραιας μεταβλητής num στην οθόνη της οθόνης χρησιμοποιώντας τη συνάρτηση printf():

int num;
αριθμός = 5;
printf(“%d”, num);

Οι δύο πρώτες γραμμές αυτού του προγράμματος ορίζουν μια μεταβλητή που ονομάζεται num τύπου int. Η τρίτη γραμμή εκτυπώνει τη μεταβλητή στην οθόνη. Η συνάρτηση printf() λειτουργεί ως εξής. Αρχικά, η συνάρτηση αναλύει τη συμβολοσειρά που πρέπει να εμφανιστεί. Σε αυτήν την περίπτωση είναι "%d". Εάν βρεθεί ένας προσδιοριστής σε αυτή τη γραμμή, τότε η τιμή της μεταβλητής, που είναι το δεύτερο όρισμα της συνάρτησης printf(), γράφεται στη θέση της. Ως αποτέλεσμα, αντί για την αρχική συμβολοσειρά "%d", θα εμφανιστεί στην οθόνη η συμβολοσειρά "5", δηλ. θα εμφανιστεί ο αριθμός 5.

Θα πρέπει να σημειωθεί ότι ο προσδιοριστής "%d" εξάγει μόνο τύπους ακέραιων μεταβλητών, όπως int. Για να συμπεράνουμε άλλους τύπους, πρέπει να χρησιμοποιήσετε διαφορετικούς προσδιοριστές. Οι κύριοι τύποι προσδιοριστών παρατίθενται παρακάτω:

%с – μεμονωμένος χαρακτήρας
%d – υπογεγραμμένος δεκαδικός ακέραιος
%f – αριθμός κινητής υποδιαστολής (δεκαδικός συμβολισμός)
%s – συμβολοσειρά χαρακτήρων (για μεταβλητές συμβολοσειράς)
%u – ανυπόγραφος δεκαδικός ακέραιος
%% - εκτυπώστε το σύμβολο ποσοστού

Χρησιμοποιώντας τη συνάρτηση printf(), μπορείτε να εκτυπώσετε πολλές μεταβλητές ταυτόχρονα. Για αυτό χρησιμοποιείται η ακόλουθη κατασκευή:

int num_i;
float num_f;
num_i = 5;
num_f = 10,5;
printf("num_i = %d, num_f = %f", num_i, num_f);

Το αποτέλεσμα της εκτέλεσης του προγράμματος θα μοιάζει με αυτό:

num_i = 5, num_f = 10,5

Εκτός από τους προσδιοριστές, η συνάρτηση printf() χρησιμοποιεί χαρακτήρες ελέγχου, όπως newline \n, tabs \t, κ.λπ. Για παράδειγμα, εάν στο παράδειγμα που συζητήθηκε προηγουμένως είναι απαραίτητο να εμφανιστούν οι τιμές των μεταβλητών που δεν είναι σε μια γραμμή , αλλά σε μια στήλη, τότε πρέπει να ξαναγράψετε τη συνάρτηση printf() με τον ακόλουθο τρόπο:

printf("num_i = %d,\n num_f = %f", num_i, num_f);

Ο χαρακτήρας καρτέλας χρησιμοποιείται με τον ίδιο τρόπο.

Για να εισαγάγετε πληροφορίες από το πληκτρολόγιο, είναι βολικό να χρησιμοποιήσετε τη συνάρτηση scanf() της βιβλιοθήκης stdio.h, η οποία έχει την ακόλουθη σύνταξη:

int scanf(const char *format [,argument]...);

Εδώ, όπως και με τη συνάρτηση printf(), η μεταβλητή *format ορίζει μια συμβολοσειρά μορφής για τον προσδιορισμό του τύπου των δεδομένων εισόδου και μπορεί να περιέχει τους ίδιους προσδιοριστές με τη συνάρτηση printf(). Στη συνέχεια ακολουθεί μια λίστα με προαιρετικά ορίσματα. Η λειτουργία της συνάρτησης scanf() παρουσιάζεται στην Λίστα 1.4.

Λίστα 1.4. Ένα παράδειγμα χρήσης της συνάρτησης scanf().

#περιλαμβάνω
int main()
{
int ηλικία?
βάρος επίπλευσης
printf("Εισαγάγετε τα στοιχεία της ηλικίας σας: ");
scanf("%d", &age);
printf("Εισαγάγετε τα στοιχεία βάρους σας: ");
scanf("%f", &weight);
printf("Η ηλικία σας = %d, το βάρος σας = %f", ηλικία, βάρος);

Επιστροφή 0;
}

Η κύρια διαφορά μεταξύ της χρήσης της συνάρτησης scanf() και της συνάρτησης printf() είναι το σύμβολο & πριν από το όνομα της μεταβλητής στην οποία εγγράφονται τα αποτελέσματα εισόδου.

Η συνάρτηση scanf() μπορεί να λειτουργήσει με πολλές μεταβλητές ταυτόχρονα. Ας υποθέσουμε ότι πρέπει να εισαγάγετε δύο ακέραιους αριθμούς από το πληκτρολόγιο. Επίσημα, μπορείτε να καλέσετε τη συνάρτηση scanf() δύο φορές για να το κάνετε αυτό, αλλά είναι καλύτερο να χρησιμοποιήσετε αυτήν την κατασκευή:

scanf(“ %d, %d ”, &n, &m);

Η συνάρτηση scanf() το ερμηνεύει ως αναμονή από τον χρήστη να εισάγει έναν αριθμό, μετά ένα κόμμα και μετά έναν δεύτερο αριθμό. Όλα λειτουργούν σαν να πρέπει να εισαγάγετε δύο ακέραιους αριθμούς ως εξής:

Η συνάρτηση scanf() επιστρέφει τον αριθμό των στοιχείων που διαβάστηκαν με επιτυχία. Εάν δεν συνέβη καμία λειτουργία ανάγνωσης, η οποία συμβαίνει όταν εισάγεται ένα γράμμα αντί της αναμενόμενης αριθμητικής τιμής, τότε η τιμή επιστροφής είναι 0.

Η συνάρτηση scanf() είναι μια συνάρτηση πολλαπλών χρήσεων που σας επιτρέπει να εισάγετε οποιονδήποτε τύπο δεδομένων στον υπολογιστή σας. Το όνομα της συνάρτησης αντικατοπτρίζει τον σκοπό της - η λειτουργία σαρώνει (προβάλλει) το πληκτρολόγιο, καθορίζει ποια πλήκτρα θα πατηθούν και, στη συνέχεια, ερμηνεύει την είσοδο με βάση τους μορφοποιημένους χαρακτήρες SCAN. Ακριβώς όπως η συνάρτηση printf(), έτσι και η scanf() μπορεί να λάβει πολλά ορίσματα, επιτρέποντάς σας να εισάγετε τις τιμές των μεταβλητών αριθμητικών, χαρακτήρων και συμβολοσειρών ταυτόχρονα.

Ακριβώς όπως η λίστα παραμέτρων printf(), η λίστα παραμέτρων συνάρτησης scanf() αποτελείται από δύο μέρη: μια συμβολοσειρά μορφοποίησης και μια λίστα δεδομένων (Εικόνα 5.7). Η γραμμή μορφοποίησης περιέχει δείκτες μορφής, εδώ καλούνται μετατροπείς χαρακτήρων*, που καθορίζουν τον τρόπο ερμηνείας των δεδομένων εισόδου. Η λίστα δεδομένων περιέχει μεταβλητές στις οποίες πρέπει να εισαχθούν οι εισαγόμενες τιμές.

Ρύζι. 5.7. Η λίστα παραμέτρων συνάρτησης scanf() χωρίζεται σε δύο μέρη

Οι δείκτες μορφής είναι παρόμοιοι με αυτούς που χρησιμοποιούνται από τη συνάρτηση printf():

Κατά την εισαγωγή αριθμητικών δεδομένων ή δεδομένων χαρακτήρων, θα πρέπει να καθορίσετε τη διεύθυνση της μεταβλητής στη λίστα δεδομένων της συνάρτησης scanf() και όχι μόνο το όνομά της:

scanf("%f", &amount);

* ΣΕπρωτότυποχαρακτήρες μετατροπής.(Περίπου μετάφραση)

Σε αυτό το παράδειγμα, η συνάρτηση scanf() παίρνει έναν αριθμό κινητής υποδιαστολής και τον τοποθετεί στην περιοχή μνήμης που έχει δεσμευτεί για τη μεταβλητή ποσότητα. Μόλις τοποθετηθεί ένας αριθμός σε αυτήν την περιοχή μνήμης, γίνεται αυτόματα η τιμή της μεταβλητής.

Ενώ εκτελείται η συνάρτηση scanf(), η εκτέλεση του προγράμματος αναστέλλεται και το πρόγραμμα περιμένει για εισαγωγή δεδομένων. Η είσοδος τελειώνει με το πάτημα του πλήκτρου Εισαγω.

Η αρχή της εργασίας με δεδομένα της συνάρτησης scanf() είναι θεμελιωδώς διαφορετική από την εργασία των συναρτήσεων gets() και getchar(). Για να καταλάβετε τι ακριβώς συμβαίνει όταν πληκτρολογείτε χρησιμοποιώντας scanf(), πρέπει να εξετάσετε λεπτομερώς αυτές τις διαφορές.

Ροή εισόδου

Όταν τα δεδομένα εισάγονται χρησιμοποιώντας τη συνάρτηση gets(), όλοι οι χαρακτήρες που πληκτρολογήθηκαν στο πληκτρολόγιο πριν πατηθούν Εισαγω, γίνεται η τιμή της μεταβλητής. Όταν ένας χαρακτήρας εισάγεται χρησιμοποιώντας τη συνάρτηση getchar(), το πάτημα ενός πλήκτρου προκαλεί αυτόματα την εκχώρηση του αντίστοιχου χαρακτήρα σε μια μεταβλητή.

Η συνάρτηση scanf() λειτουργεί διαφορετικά. Αντί απλώς να λαμβάνει δεδομένα και να τα εκχωρεί σε μια μεταβλητή, η scanf() χρησιμοποιεί πρώτα δείκτες μορφής για να προσδιορίσει πώς πρέπει να αντιμετωπίζονται οι χαρακτήρες εισόδου.

Λέγεται συνήθως ότι η scanf() λαμβάνει δεδομένα από ροή εισόδου. Μια ροή εισόδου είναι μια ακολουθία συμβόλων που προέρχονται από κάποια πηγή. Στην περίπτωση της συνάρτησης scanf(), η πηγή είναι το πληκτρολόγιο. Αφού πατήσετε το πλήκτρο ΕισαγωΌλα τα δεδομένα που έχουν εισαχθεί μέχρι αυτή τη στιγμή μεταβιβάζονται στη συνάρτηση scanf() με τη μορφή ενός συνόλου χαρακτήρων χωρίς νόημα, με την ίδια σειρά με την οποία πληκτρολογήθηκαν. Στη συνέχεια, η scanf() καθορίζει ποιοι χαρακτήρες ταιριάζουν με τον τύπο που καθορίζεται από τον προσδιοριστή μορφής και ποιοι πρέπει να αγνοηθούν. Οι δείκτες μορφής ονομάζονται μετατροπείς χαρακτήρων επειδή λαμβάνουν ακατέργαστους χαρακτήρες από τη ροή εισόδου και τους μετατρέπουν σε δεδομένα συγκεκριμένου τύπου. Το σχήμα 5.8 απεικονίζει αυτή τη διαδικασία.

Η συνάρτηση scanf() αγνοεί χαρακτήρες χωρίς πληροφορίες: κενά, καρτέλες και νέες γραμμές, εκτός εάν ο τρέχων τύπος δεδομένων είναι χαρακτήρες. Ας δούμε το πρόγραμμα:

puts("Παρακαλώ εισάγετε έναν αριθμό: ");

scanf("%d", &count);

printf("Ο αριθμός είναι %d", count);

Ρύζι. 5.8. Η συνάρτηση scanf() διαβάζει τη ροή εισόδου και καθορίζει ποια δεδομένα πρέπει να εισαχθούν και ποια δεδομένα πρέπει να αγνοηθούν.

Πριν εισαγάγετε έναν αριθμό, μπορείτε να πατήσετε το πλήκτρο διαστήματος όσο θέλετε - το C θα αγνοήσει τα κενά, περιμένοντας τον πρώτο σημαντικό χαρακτήρα. Στη συνέχεια, το C θα προσπαθήσει να μετατρέψει τους χαρακτήρες σύμφωνα με τους προσδιοριστές μορφής στη συμβολοσειρά μορφής της συνάρτησης scanf(). Εάν αυτοί οι χαρακτήρες ταιριάζουν με τη μορφή (σε αυτήν την περίπτωση, αν είναι αριθμοί), θα εισαχθούν στη μεταβλητή. Η εισαγωγή δεδομένων θα σταματήσει εάν συναντήσετε έναν χαρακτήρα που δεν είναι στην αναμενόμενη μορφή, δηλαδή δεν είναι αριθμός. Για παράδειγμα, εάν πληκτρολογήσετε την ακολουθία "123abc" στο πληκτρολόγιο, τότε ο αριθμός 123 στο παράδειγμά μας θα εκχωρηθεί στη μεταβλητή count και τα γράμματα "abc" θα αγνοηθούν, όπως φαίνεται στην Εικ. 5.9. Ένα κενό μπορεί να προκαλέσει διακοπή της εισαγωγής δεδομένων. Για παράδειγμα, εάν πληκτρολογήσετε "123", στη μεταβλητή θα εκχωρηθεί η τιμή 12 και ο αριθμός 3 θα αγνοηθεί.

Ρύζι. 5.9. Η συνάρτηση scanf() σταματά να εισάγει δεδομένα όταν συναντήσει τον πρώτο μη αριθμητικό χαρακτήρα.

Ο πρώτος σημαντικός χαρακτήρας πρέπει να ταιριάζει με τη μορφή που καθορίζεται στο όρισμα της συνάρτησης scanf(). Έτσι, εάν πληκτρολογήσετε την ακολουθία "ABC123", το πρόγραμμα θα αγνοήσει ολόκληρη την ακολουθία, αφήνοντάς σας στο σκοτάδι σχετικά με την τιμή της μεταβλητής.

Τους χαρακτήρες που το πρόγραμμα θεωρεί "κατάλληλους" εξαρτάται από τους δείκτες μορφής. Εάν ο δείκτης είναι %d, τότε μόνο οι αριθμοί και το σύμβολο μείον είναι "κατάλληλοι". Εάν βάλετε τον δείκτη %x, τότε οι χαρακτήρες 0123456789ABCDE θα αντιστοιχούν στη μορφή, καθώς χρησιμοποιούνται όλοι κατά την εγγραφή αριθμών στο δεκαεξαδικό σύστημα αριθμών. Εάν υπάρχει ο δείκτης %c, οι χαρακτήρες γίνονται δεκτοί, ακόμη και ένα διάστημα μέσα στη ροή εισόδου δεν αγνοείται από τη συνάρτηση scanf(). Εάν γράψετε οδηγίες:

scanf("%c", &γράμμα);

και πατήστε το πλήκτρο διαστήματος στην αρχή μιας ακολουθίας σημαντικών χαρακτήρων, η scanf() θα ορίσει τη μεταβλητή σε διάστημα, αγνοώντας τους επόμενους χαρακτήρες. Επομένως, όταν ασχολείστε με τον τύπο χαρακτήρων, δεν μπορείτε να τοποθετήσετε κενά πριν από άλλους χαρακτήρες.

Όταν εισάγετε μια συμβολοσειρά, η συνάρτηση scanf() θα αρχίσει να εκχωρεί μια τιμή στον πρώτο σημαντικό χαρακτήρα, αγνοώντας τα κύρια κενά και θα σταματήσει να εκχωρεί όταν συναντήσει το πρώτο διάστημα μεταξύ σημαντικών χαρακτήρων. Ρίξτε μια ματιά στο πρόγραμμα:

puts("Παρακαλώ εισάγετε το όνομά σας: ");

scanf("%s", όνομα);

Λάβετε υπόψη ότι ο τελεστής διεύθυνσης λήψης δεν χρησιμοποιείται με όνομα μεταβλητής συμβολοσειράς. Εάν πληκτρολογήσετε "Nancy" στο πληκτρολόγιό σας και πατήσετε Enter, αυτοί οι χαρακτήρες θα αντιστοιχιστούν στη μεταβλητή ονόματος. Ακόμα κι αν πληκτρολογήσετε "Nancy Chasin", το scanf() θα αρχίσει να εκχωρεί χαρακτήρες στον πρώτο σημαντικό χαρακτήρα και θα σταματήσει όταν συναντήσει το πρώτο διάστημα, επομένως η τιμή της μεταβλητής θα εξακολουθεί να είναι μόνο το όνομα της Nancy και το πρόγραμμα θα αγνοεί τους υπόλοιπους (Εικόνα 5.10).

Ρύζι. 5.10. Η συνάρτηση scanf() σταματά την ανάγνωση χαρακτήρων σε μια συμβολοσειρά στο πρώτο διάστημα

Λόγω αυτού του χαρακτηριστικού της συνάρτησης scanf(), δεν είναι πολύ βολικό για την εισαγωγή συμβολοσειρών. Σε αυτές τις περιπτώσεις, είναι καλύτερο να χρησιμοποιήσετε τη συνάρτηση gets().

Η συνάρτηση scanf() είναι μια ρουτίνα εισαγωγής γενικής χρήσης που διαβάζει δεδομένα από το stdin. Μπορεί να διαβάσει όλους τους βασικούς τύπους δεδομένων και να τους μετατρέψει αυτόματα στην επιθυμητή εσωτερική μορφή. Εάν η printf() έκανε είσοδο αντί για έξοδο, θα μπορούσε να ονομαστεί ανάλογο της scanf().

Η συμβολοσειρά ελέγχου που επισημαίνεται κατά μορφή αποτελείται από τρεις τύπους χαρακτήρων:

  • Προσδιοριστές μορφής
  • Ειδικά σύμβολα
  • Άλλοι χαρακτήρες (όχι ειδικοί)

Οι προσδιοριστές μορφής ακολουθούν το σύμβολο ποσοστού και λένε στη scanf() ποιος τύπος δεδομένων θα διαβαστεί στη συνέχεια. Οι κωδικοί προσδιορισμού δίνονται στον πίνακα.

Πίνακας: Μορφοποίηση κωδικών για scanf()
Κώδικας Εννοια
%Με Μετρήστε έναν χαρακτήρα
%ρε
%Εγώ Μετρήστε δεκαδικό αριθμό ακέραιου τύπου
%μι
%φά Μετρήστε τον αριθμό κινητής υποδιαστολής
%σολ Μετρήστε τον αριθμό κινητής υποδιαστολής
%O Μετρήστε τον οκταδικό αριθμό
%μικρό Γραμμή μέτρησης
Μετρήστε δεκαεξαδικό αριθμό
%R Δείκτης μέτρησης
%n Λαμβάνει μια ακέραια τιμή ίση με τον αριθμό των χαρακτήρων που διαβάστηκαν μέχρι στιγμής
%u Διαβάζει έναν ανυπόγραφο ακέραιο
% Προβάλλει ένα σύνολο χαρακτήρων
%% Διαβάζει τον χαρακτήρα %

Για παράδειγμα, το %s διαβάζει μια συμβολοσειρά και το %d διαβάζει μια ακέραια μεταβλητή.

Η συμβολοσειρά μορφοποίησης διαβάζεται από τα αριστερά προς τα δεξιά, ταιριάζοντας τους κωδικούς μορφής με τα ορίσματα στη λίστα ορισμάτων.

Οι ειδικοί χαρακτήρες στη συμβολοσειρά ελέγχου προκαλούν το scanf() να παραλείψει έναν ή περισσότερους ειδικούς χαρακτήρες στη ροή εισόδου. Οι ειδικοί χαρακτήρες είναι το διάστημα, η καρτέλα ή η νέα γραμμή. Ένας μεμονωμένος ειδικός χαρακτήρας στη γραμμή ελέγχου αναγκάζει το scanf() να διαβάσει, χωρίς αποθήκευση, οποιονδήποτε αριθμό (συμπεριλαμβανομένου του μηδέν) διαδοχικών ειδικών χαρακτήρων από τη ροή εισόδου μέχρι να συναντήσει έναν χαρακτήρα που δεν είναι ειδικός χαρακτήρας.

Η παρουσία ενός κανονικού χαρακτήρα αναγκάζει το scanf() να διαβάσει και να απορρίψει τον αντίστοιχο χαρακτήρα. Για παράδειγμα, το "%d,%d" κάνει το scanf() να διαβάσει έναν ακέραιο, να διαβάσει και να απορρίψει το κόμμα και μετά να διαβάσει έναν άλλο ακέραιο. Εάν ο καθορισμένος χαρακτήρας δεν βρεθεί στη ροή εισόδου, η scanf() σταματά.

Όλες οι μεταβλητές που χρησιμοποιούνται για τη λήψη τιμών χρησιμοποιώντας τη συνάρτηση scanf() πρέπει να αναζητηθούν από τις διευθύνσεις τους. Αυτό σημαίνει ότι όλα τα ορίσματα συνάρτησης πρέπει να είναι δείκτες σε μεταβλητές. Έτσι, το C δημιουργεί τη δυνατότητα μετάβασης μέσω αναφοράς και αυτό επιτρέπει στη συνάρτηση να αλλάξει τα περιεχόμενα του ορίσματος.

Scanf("%d", &count);

Οι συμβολοσειρές διαβάζονται σε πίνακες χαρακτήρων και το όνομα του πίνακα, χωρίς κανένα δείκτη, είναι η διεύθυνση του πρώτου στοιχείου του πίνακα. Επομένως, για να διαβάσετε μια συμβολοσειρά στη διεύθυνση πίνακα χαρακτήρων, μπορείτε να χρησιμοποιήσετε την εντολή

Scanf("%s", διεύθυνση);

Σε αυτήν την περίπτωση, η διεύθυνση ονόματος είναι ήδη δείκτης και δεν χρειάζεται το πρόθεμα &.

Τα στοιχεία δεδομένων εισόδου πρέπει να διαχωρίζονται με κενά, καρτέλες ή νέες γραμμές.
Τα σημεία στίξης όπως κόμματα, ερωτηματικά κ.λπ. δεν θεωρούνται οριοθέτες. Αυτό σημαίνει ότι για τον χειριστή

Scanf("%d%d", &r, &с);

Η ακολουθία 10 20 θα γίνει αποδεκτή, αλλά η ακολουθία 10, 20 όχι. Οι προσδιοριστές μορφής scanf() έχουν την ίδια σειρά με τις μεταβλητές στη λίστα ορισμάτων, στις οποίες εκχωρούνται οι τιμές των λαμβανόμενων μεταβλητών.

Το σύμβολο * μετά το % και πριν από τον προσδιοριστή μορφής διαβάζει δεδομένα του καθορισμένου τύπου, αλλά καταστέλλει την ανάθεση σε αυτό. Ο κώδικας λοιπόν

Scanf("%d%*c%d", &x, &y);

Όταν εισάγετε την ακολουθία 10/20, εκχωρεί την τιμή 10 στη μεταβλητή x, απορρίπτει τον χαρακτήρα / και εκχωρεί την τιμή 20 στη μεταβλητή y.

Οι εντολές μορφοποίησης μπορούν να καθορίσουν έναν τροποποιητή για το μέγιστο πλάτος πεδίου. Είναι ένας ακέραιος που τοποθετείται ανάμεσα στο σύμβολο % και τον προσδιοριστή μορφής. Περιορίζει τον αριθμό των χαρακτήρων που διαβάζονται για κάθε δεδομένο πεδίο. Για παράδειγμα, εάν δεν χρειάζεται να διαβάσετε περισσότερους από 20 χαρακτήρες στον πίνακα διευθύνσεων, θα γράφατε

Scanf("%20s", διεύθυνση);

Εάν η ροή εισόδου περιείχε περισσότερους από 20 χαρακτήρες, τότε την επόμενη φορά που θα κληθεί η συνάρτηση εισαγωγής, θα ξεκινήσει η εισαγωγή από το σημείο όπου η είσοδος σταμάτησε κατά την τρέχουσα κλήση. Η καταχώρηση πεδίου μπορεί να ματαιωθεί προτού επιτευχθεί το μέγιστο μήκος πεδίου, εάν συναντήσετε κενό διάστημα. Σε αυτήν την περίπτωση, η scanf() μετακινείται στο επόμενο πεδίο.

Παρόλο που τα κενά, οι καρτέλες και οι νέες γραμμές χρησιμοποιούνται ως διαχωριστικά πεδίων, διαβάζονται όπως κάθε άλλος χαρακτήρας κατά την εισαγωγή ενός μεμονωμένου χαρακτήρα. Για παράδειγμα, δίνεται μια συνάρτηση ροής εισόδου x y

Scanf("%c%c%c", &a, &b, &c);

Τοποθετεί το x στη μεταβλητή a, το διάστημα στη μεταβλητή b και το y στη μεταβλητή c.

Ένα πράγμα που πρέπει να προσέχετε είναι ότι οποιοιδήποτε άλλοι χαρακτήρες στη συμβολοσειρά ελέγχου - συμπεριλαμβανομένων των διαστημάτων, των καρτελών και των νέων γραμμών - χρησιμοποιούνται για την ένδειξη και την απόρριψη χαρακτήρων από τη ροή εισόδου. Για παράδειγμα, με ροή εισόδου 10t20, η συνάρτηση

Scanf("%st%s", &x, &y);

Θέσεις 10 σε x και 20 σε y. Ο χαρακτήρας t θα απορριφθεί επειδή υπάρχει ένα t στη συμβολοσειρά ελέγχου.

Ένα άλλο χαρακτηριστικό της συνάρτησης scanf() ονομάζεται σύνολο σάρωσης. Το σύνολο σάρωσης ορίζει τους χαρακτήρες που θα διαβαστούν από τη συνάρτηση scanf() και θα εκχωρηθούν στα στοιχεία του αντίστοιχου πίνακα χαρακτήρων. Για να ορίσετε ένα σύνολο σάρωσης, πρέπει να τοποθετήσετε χαρακτήρες των οποίων η εισαγωγή είναι αποδεκτή σε αγκύλες. Πριν από την πρώτη αγκύλη υπάρχει ένα σύμβολο τοις εκατό. Για παράδειγμα, η ακόλουθη λίστα συνόλων σάρωσης προσδιορίζει ότι η scanf() διαβάζει μόνο τους χαρακτήρες A, B και C:

Το όρισμα που αντιστοιχεί στη λίστα συνόλων σάρωσης πρέπει να είναι δείκτης σε πίνακα χαρακτήρων. Όταν χρησιμοποιείτε ένα σύνολο σάρωσης, το scanf() διαβάζει χαρακτήρες και τους τοποθετεί στον καθορισμένο πίνακα μέχρι να συναντήσει έναν χαρακτήρα που δεν είναι στο σύνολο σάρωσης (δηλαδή, διαβάζονται μόνο οι χαρακτήρες που βρίσκονται στο σύνολο σάρωσης).

Ο πίνακας που επιστρέφεται από το scanf() θα περιέχει μια συμβολοσειρά με μηδενικό τερματισμό. Η λίστα των χαρακτήρων προς ανάγνωση μπορεί επίσης να καθοριστεί σε αντίστροφη μορφή. Για να το κάνετε αυτό, τοποθετήστε το ^ ως τον πρώτο χαρακτήρα. Στη συνέχεια, το scanf() θα δεχτεί οποιονδήποτε χαρακτήρα δεν βρίσκεται στο σύνολο σάρωσης.

Μπορείτε να χρησιμοποιήσετε εισαγωγικά για να καθορίσετε το εύρος των χαρακτήρων που θα γίνουν δεκτοί. Για παράδειγμα, η ακόλουθη έκφραση δίνει εντολή στη scanf() να δέχεται τα γράμματα "A" έως "Z":

Η πολλαπλή σάρωση κάνει διάκριση μεταξύ κεφαλαίων και πεζών γραμμάτων. Εάν θέλετε το scanf() να δέχεται και τα δύο, πρέπει να τα καταχωρήσετε ξεχωριστά στο σύνολο σάρωσης.

Η συνάρτηση scanf() επιστρέφει έναν αριθμό ίσο με τον αριθμό των πεδίων των οποίων οι τιμές είχαν πραγματικά εκχωρηθεί στις μεταβλητές. Αυτό το πλήθος δεν περιλαμβάνει πεδία που διαβάστηκαν, αλλά οι τιμές τους δεν αντιστοιχίστηκαν σε τίποτα λόγω της χρήσης του τροποποιητή * για την κατάργηση της ανάθεσης. Εάν προέκυψε σφάλμα πριν από την εκχώρηση του πρώτου πεδίου, επιστρέφεται ο ΕΟΦ.

Όταν χρησιμοποιείτε το Borland C++ σε περιβάλλον 16 bit, μπορείτε να αλλάξετε το προεπιλεγμένο μοντέλο μνήμης που χρησιμοποιείται για τη μεταγλώττιση ενός προγράμματος, προσδιορίζοντας ρητά το μέγεθος κάθε δείκτη που χρησιμοποιείται κατά την κλήση του scanf(). Ο κοντινός δείκτης καθορίζεται από τον τροποποιητή N και ο δείκτης μακριά από τον τροποποιητή F (Δεν μπορείτε να χρησιμοποιήσετε τον τροποποιητή N εάν το πρόγραμμα έχει μεταγλωττιστεί για το μοντέλο τεράστιας μνήμης.)

Η συνάρτηση scanf() είναι μια διαδικασία γενικού σκοπού που διαβάζει το stdin και αποθηκεύει τις πληροφορίες σε μεταβλητές που καθορίζονται από τα ορίσματα που αναφέρονται στη λίστα ορισμάτων. Μπορεί να διαβάσει όλους τους ενσωματωμένους τύπους δεδομένων και να τους μετατρέψει αυτόματα στην κατάλληλη εσωτερική μορφή.

Στην έκδοση C99, ο προσδιορισμός περιορισμού εφαρμόστηκε στην παράμετρο μορφής.

Η συμβολοσειρά ελέγχου που καθορίζεται από την παράμετρο format αποτελείται από χαρακτήρες τριών κατηγοριών:

  • προσδιοριστές μορφής·
  • χαρακτήρες κενού διαστήματος.
  • χαρακτήρες εκτός από το κενό διάστημα.

Οι προσδιοριστές μορφής - πριν από το σύμβολο του ποσοστού (%) - λένε ποιος τύπος δεδομένων θα διαβαστεί στη συνέχεια. Για παράδειγμα, ο προσδιοριστής %s θα διαβάσει μια συμβολοσειρά και ο %d θα διαβάσει μια ακέραια τιμή. Η συμβολοσειρά μορφής διαβάζεται από τα αριστερά προς τα δεξιά και οι προσδιοριστές μορφής αντιστοιχίζονται κατά σειρά με τα ορίσματα που αναφέρονται στη λίστα ορισμάτων. Αυτοί οι κωδικοί φαίνονται στον παρακάτω πίνακα.

Κώδικας Σκοπός
%ΕΝΑ Διαβάζει μια τιμή κινητής υποδιαστολής (μόνο C99)
%ΕΝΑ Ίδιο με τον κωδικό %a (μόνο C99)
%Με Διαβάζει έναν χαρακτήρα
%ρε Διαβάζει δεκαδικό ακέραιο
%Εγώ Διαβάζει έναν ακέραιο σε οποιαδήποτε μορφή (δεκαδικός, οκταδικός, δεκαεξαδικός)
%μι Διαβάζει έναν πραγματικό αριθμό
%ΜΙ Ίδιο με τον κωδικό %e
%φά Διαβάζει έναν πραγματικό αριθμό
%ΦΑ Παρόμοιο με τον κωδικό %f (μόνο C99)
%σολ Διαβάζει έναν πραγματικό αριθμό
%ΣΟΛ Ίδιο με το %g
%O Διαβάζει έναν οκταδικό αριθμό
%μικρό Διαβάζει μια γραμμή
Διαβάζει δεκαεξαδικό αριθμό
Ίδιο με τον κωδικό %x
%R Διαβάζει τον δείκτη
%n Λαμβάνει μια ακέραια τιμή ίση με τον αριθμό των χαρακτήρων που διαβάστηκαν μέχρι στιγμής
%u Διαβάζει έναν ανυπόγραφο δεκαδικό ακέραιο
% Προβάλλει ένα σύνολο χαρακτήρων
%% Διαβάζει το σύμβολο τοις εκατό

Από προεπιλογή, οι προσδιοριστές a, f, e και g προκαλούν τη scanf() να εκχωρήσει δεδομένα σε μεταβλητές float. Εάν προσθέσετε πρόθεμα σε έναν από αυτούς τους προσδιοριστές μορφής με τον τροποποιητή l, η συνάρτηση scanf() θα εκχωρήσει τα δεδομένα που διάβασε σε μια μεταβλητή τύπου double. Η χρήση του τροποποιητή L σημαίνει ότι η μεταβλητή που λαμβάνει την τιμή είναι τύπου long double.

Εάν χρησιμοποιείτε έναν σύγχρονο μεταγλωττιστή που υποστηρίζει τις δυνατότητες χαρακτήρων δύο byte που προστέθηκαν το 1995, μπορείτε να χρησιμοποιήσετε τον τροποποιητή l στον προσδιοριστή c για να υποδηλώσετε έναν δείκτη σε έναν χαρακτήρα διπλού byte με τύπο δεδομένων whcar_t. Ο τροποποιητής l μπορεί επίσης να χρησιμοποιηθεί με τον κωδικό μορφής s για να υποδηλώσει έναν δείκτη σε μια συμβολοσειρά χαρακτήρων διπλού byte. Επιπλέον, ο τροποποιητής l μπορεί να χρησιμοποιηθεί για την τροποποίηση του συνόλου των χαρακτήρων διπλού byte που σαρώνονται.

Οι χαρακτήρες κενού διαστήματος στη συμβολοσειρά μορφής προκαλούν τη συνάρτηση scanf() να παραλείψει έναν ή περισσότερους χαρακτήρες κενού διαστήματος στη ροή εισόδου. Ένας χαρακτήρας κενού διαστήματος σημαίνει χαρακτήρα κενού, καρτέλας ή νέας γραμμής. Ουσιαστικά, ένας μεμονωμένος χαρακτήρας κενού διαστήματος στη συμβολοσειρά ελέγχου θα αναγκάσει το scanf() να διαβάσει, αλλά όχι να αποθηκεύσει, οποιονδήποτε αριθμό (ακόμη και μηδέν) χαρακτήρων κενού διαστήματος πριν από τον πρώτο χαρακτήρα χωρίς κενά.

Ένας χαρακτήρας χωρίς κενά στη συμβολοσειρά μορφοποίησης κάνει το scanf() να διαβάσει και να απορρίψει τον αντίστοιχο χαρακτήρα. Για παράδειγμα, όταν χρησιμοποιείτε τη συμβολοσειρά μορφής %d, %d, η scanf() θα διαβάσει πρώτα την ακέραια τιμή, μετά θα διαβάσει και θα απορρίψει το κόμμα και τέλος θα διαβάσει έναν άλλο ακέραιο. Εάν δεν βρεθεί ο καθορισμένος χαρακτήρας, η scanf() θα βγει.

Όλες οι μεταβλητές που χρησιμοποιούνται για τη λήψη τιμών που χρησιμοποιούν τη συνάρτηση scanf() πρέπει να περάσουν από τις διευθύνσεις τους. Αυτό σημαίνει ότι όλα τα ορίσματα πρέπει να είναι δείκτες σε μεταβλητές.

Τα στοιχεία της ροής εισόδου πρέπει να διαχωρίζονται με κενά, καρτέλες ή νέες γραμμές. Χαρακτήρες όπως κόμμα, ερωτηματικό κ.λπ. δεν αναγνωρίζονται ως οριοθέτες. Αυτό σημαίνει ότι ο χειριστής

Scanf("%d%d", &r, &c);

θα δεχτεί τιμές που έχουν εισαχθεί ως 10 20, αλλά θα αρνηθεί κατηγορηματικά το "πιάτο" που σερβίρεται ως 10,20.

Ο χαρακτήρας * μετά το σύμβολο % και πριν από τον κωδικό μορφής θα διαβάσει τα δεδομένα του καθορισμένου τύπου, αλλά θα απαγορεύσει την εκχώρηση τους. Επομένως ο χειριστής

Scanf("%d%*c%d", &x, &y);

όταν εισαχθεί ως 10/20, θα τοποθετήσει την τιμή 10 στη μεταβλητή x, θα απορρίψει το σύμβολο της διαίρεσης και θα εκχωρήσει την τιμή 20 στη μεταβλητή y.

Οι εντολές μορφοποίησης μπορεί να περιέχουν έναν τροποποιητή μέγιστου μήκους πεδίου. Είναι ένας ακέραιος που τοποθετείται ανάμεσα στο σύμβολο % και έναν κωδικό μορφής που περιορίζει τον αριθμό των χαρακτήρων που διαβάζονται για κάθε δεδομένο πεδίο. Για παράδειγμα, εάν θέλετε να διαβάσετε έως και 20 χαρακτήρες στη μεταβλητή διεύθυνσης, χρησιμοποιήστε την ακόλουθη πρόταση.

Scanf("%20s", διεύθυνση);

Εάν η ροή εισόδου περιέχει περισσότερους από 20 χαρακτήρες, τότε την επόμενη φορά που θα προσπελαστεί η λειτουργία εισαγωγής, η ανάγνωση θα ξεκινήσει από το σημείο όπου η προηγούμενη κλήση της συνάρτησης scanf() "σταμάτησε". Εάν αντιμετωπιστεί χαρακτήρας κενού διαστήματος, η εισαγωγή δεδομένων για ένα πεδίο μπορεί να ολοκληρωθεί πριν επιτευχθεί το μέγιστο μήκος πεδίου. Σε αυτήν την περίπτωση, η συνάρτηση scanf() προχωρά στην ανάγνωση του επόμενου πεδίου.

Παρόλο που τα κενά, οι καρτέλες και οι νέες γραμμές χρησιμοποιούνται ως διαχωριστικά πεδίων, κατά την ανάγνωση ενός μεμονωμένου χαρακτήρα διαβάζονται όπως κάθε άλλος χαρακτήρας. Για παράδειγμα, εάν η ροή εισόδου αποτελείται από χαρακτήρες x y, τότε ο τελεστής

Scanf("%c%c%c", &a, &b, &c);

θα τοποθετήσει τον χαρακτήρα x στη μεταβλητή a, το διάστημα στη μεταβλητή b και τον χαρακτήρα y στη μεταβλητή c.

Να θυμάστε ότι οποιοιδήποτε άλλοι χαρακτήρες συμβολοσειράς ελέγχου που δεν είναι προσδιοριστές μορφής (συμπεριλαμβανομένων διαστημάτων, καρτελών και νέων γραμμών) χρησιμοποιούνται για την αντιστοίχιση και την απόρριψη χαρακτήρων από τη ροή εισόδου. Για παράδειγμα, εάν η ροή εισόδου μοιάζει με 10t20, η δήλωση

Scanf("%st%s", &x, &y);

θα βάλει 10 στη μεταβλητή x και 20 στη μεταβλητή y. Ο χαρακτήρας t απορρίπτεται επειδή υπάρχει στη συμβολοσειρά ελέγχου.

Ένας άλλος τρόπος χρήσης της συνάρτησης scanf() ονομάζεται scanset. Σε αυτήν την περίπτωση, ορίζεται ένα σύνολο χαρακτήρων που μπορούν να διαβαστούν από τη συνάρτηση scanf() και να εκχωρηθούν στον αντίστοιχο πίνακα χαρακτήρων. Για να ορίσετε ένα τέτοιο σύνολο, πρέπει να περικλείσετε τους χαρακτήρες που θα σαρωθούν σε αγκύλες. Η ανοιγόμενη τετράγωνη αγκύλη πρέπει να ακολουθεί αμέσως το σύμβολο ποσοστού. Για παράδειγμα, το ακόλουθο σύνολο σαρωμένων χαρακτήρων υποδεικνύει ότι πρέπει να διαβαστούν μόνο οι χαρακτήρες A, B και C.

%[ΑΛΦΑΒΗΤΟ]

Όταν χρησιμοποιείτε ένα σύνολο χαρακτήρων για σάρωση, το scanf() συνεχίζει να διαβάζει χαρακτήρες και να τους τοποθετεί στον κατάλληλο πίνακα χαρακτήρων μέχρι να συναντήσει έναν χαρακτήρα που δεν ανήκει στο καθορισμένο σύνολο χαρακτήρων. Η αντίστοιχη μεταβλητή συνόλου πρέπει να είναι δείκτης σε πίνακα χαρακτήρων. Όταν επιστρέφει το scanf(), αυτός ο πίνακας θα περιέχει μια μηδενική συμβολοσειρά των χαρακτήρων που διαβάζονται.

Εάν ο πρώτος χαρακτήρας στο σύνολο είναι ένα καρέ (^), τότε έχουμε το αντίθετο αποτέλεσμα: το πεδίο εισαγωγής διαβάζεται μέχρι τον πρώτο χαρακτήρα από το δεδομένο σύνολο χαρακτήρων, δηλ. Το caret αναγκάζει το scanf() να αποδεχτεί οποιουσδήποτε χαρακτήρες δεν έχουν οριστεί στο σύνολο.

Πολλοί μεταγλωττιστές σάς επιτρέπουν να καθορίσετε μια περιοχή χρησιμοποιώντας μια παύλα. Για παράδειγμα, η ακόλουθη δήλωση κάνει τη συνάρτηση scanf() να δέχεται τους χαρακτήρες A έως Z.

Είναι σημαντικό να θυμάστε ότι το σύνολο σαρωμένων χαρακτήρων κάνει διάκριση μεταξύ κεφαλαίων και πεζών γραμμάτων. Επομένως, εάν θέλετε να σαρώσετε και κεφαλαία και πεζά γράμματα, ορίστε τα ξεχωριστά.

Η συνάρτηση scanf() επιστρέφει έναν αριθμό ίσο με τον αριθμό των πεδίων στα οποία εκχωρήθηκαν με επιτυχία τιμές. Αυτά τα πεδία δεν περιλαμβάνουν πεδία που διαβάστηκαν αλλά δεν εκχωρήθηκαν λόγω της χρήσης του τροποποιητή * για την κατάργηση της εκχώρησης. Εάν εντοπιστεί σφάλμα πριν οριστεί το πρώτο πεδίο, η scanf() επιστρέφει EOF.

Προστέθηκαν τροποποιητές μορφοποίησης στο scanf() από το πρότυπο C99

Το C99 πρόσθεσε αρκετούς τροποποιητές μορφής για χρήση στη συνάρτηση scanf(): hh, ll, j, z και t. Ο τροποποιητής hh μπορεί να εφαρμοστεί στους προσδιοριστές d, i, o, u, x και n Σημαίνει ότι το αντίστοιχο όρισμα είναι ένας δείκτης σε μια τιμή τύπου char ή unsigned char. Ο τροποποιητής ll μπορεί επίσης να εφαρμοστεί στους προσδιοριστές d, i, o, u, x και n Σημαίνει ότι το αντίστοιχο όρισμα είναι ένας δείκτης σε μια τιμή τύπου με υπογραφή long long int ή unsigned long long int.

Ο τροποποιητής μορφής j, που εφαρμόζεται στους προσδιοριστές d, i, o, u, x και n, σημαίνει ότι το αντίστοιχο όρισμα είναι δείκτης σε μια τιμή τύπου intmax_t ή uintmax_t. Αυτοί οι τύποι δηλώνονται στην κεφαλίδα και χρησιμεύουν για την αποθήκευση ακεραίων με το μέγιστο δυνατό μήκος.

Ο τροποποιητής μορφής z, ο οποίος εφαρμόζεται στους προσδιοριστές d, i, o, u, x και n, σημαίνει ότι το αντίστοιχο όρισμα είναι ένας δείκτης σε ένα αντικείμενο τύπου size_t. Αυτός ο τύπος δηλώνεται στην κεφαλίδα και χρησιμοποιείται για την αποθήκευση του αποτελέσματος του μεγέθους της λειτουργίας.

Ο τροποποιητής μορφής t, ο οποίος εφαρμόζεται στους προσδιοριστές d, i, o, u, x και n, σημαίνει ότι το αντίστοιχο όρισμα είναι ένας δείκτης σε ένα αντικείμενο του τύπου ptrdiff_t. Αυτός ο τύπος δηλώνεται στην κεφαλίδα και χρησιμεύει για την αποθήκευση της διαφοράς τιμής μεταξύ δύο δεικτών.



Έχετε ερωτήσεις;

Αναφέρετε ένα τυπογραφικό λάθος

Κείμενο που θα σταλεί στους συντάκτες μας: