Περιγραφή λειτουργίας Scanf C
Περιγραφή λειτουργίας Scanf C

Βίντεο: Περιγραφή λειτουργίας Scanf C

Βίντεο: Περιγραφή λειτουργίας Scanf C
Βίντεο: 3000+ Portuguese Words with Pronunciation 2024, Ενδέχεται
Anonim

Σε αυτό το άρθρο, η συνάρτηση scanf() εξετάζεται σε γενική μορφή χωρίς αναφορά σε ένα συγκεκριμένο πρότυπο, επομένως τα δεδομένα από οποιαδήποτε πρότυπα C99, C11, C++11, C++14 περιλαμβάνονται εδώ. Ίσως, σε ορισμένα πρότυπα, η συνάρτηση λειτουργεί με διαφορές από το υλικό που παρουσιάζεται στο άρθρο.

scanf συνάρτηση C - περιγραφή

Η scanf() είναι μια συνάρτηση που βρίσκεται στα αρχεία κεφαλίδας stdio.h(C) και cstdio(C++), γνωστή και ως μορφοποιημένη είσοδος προγράμματος. Το scanf διαβάζει χαρακτήρες από την τυπική ροή εισόδου (stdin) και τους μετατρέπει ανάλογα με τη μορφή και στη συνέχεια τους γράφει στις καθορισμένες μεταβλητές. Μορφή - σημαίνει ότι τα δεδομένα μετατρέπονται σε μια συγκεκριμένη φόρμα κατά την παραλαβή. Έτσι, η συνάρτηση scanf C περιγράφεται:

scanf("%format", &variable1[, &variable2, […]), όπου οι μεταβλητές μεταβιβάζονται ως διευθύνσεις. Ο λόγος για αυτόν τον τρόπο μεταβίβασης μεταβλητών σε μια συνάρτηση είναι προφανής: ως αποτέλεσμα της εργασίας, επιστρέφει μια τιμή που υποδεικνύει την παρουσία σφαλμάτων, άραο μόνος τρόπος για να αλλάξετε τις τιμές των μεταβλητών είναι περνώντας από τη διεύθυνση. Επίσης, χάρη σε αυτή τη μέθοδο, η συνάρτηση μπορεί να επεξεργαστεί δεδομένα οποιουδήποτε τύπου.

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

Το Scanf επιτρέπει την εισαγωγή όλων των βασικών τύπων γλώσσας: char, int, float, string κ.λπ. Στην περίπτωση μεταβλητών τύπου string, δεν χρειάζεται να προσδιορίσετε το σύμβολο διεύθυνσης - "&", καθώς η μεταβλητή τύπου string είναι ένας πίνακας και το όνομά της είναι η διεύθυνση του πρώτου στοιχείου του πίνακα στη μνήμη του υπολογιστή.

Χρησιμοποιώντας το C σε C++
Χρησιμοποιώντας το C σε C++

Μορφή εισαγωγής δεδομένων ή συμβολοσειρά ελέγχου

Ξεκινήστε κοιτάζοντας το παράδειγμα της συνάρτησης scanf C από την περιγραφή.


include int main() { int x; ενώ (scanf("%d", &x)==1) printf("%d\n", x); επιστροφή 0; //απαίτηση για συστήματα linux }

Η μορφή εισαγωγής αποτελείται από τις ακόλουθες τέσσερις παραμέτρους: %[width][modifiers] type. Σε αυτήν την περίπτωση, το σύμβολο "%" και ο τύπος είναι υποχρεωτικές παράμετροι. Δηλαδή, η ελάχιστη μορφή μοιάζει με αυτό: "%s", "%d" και ούτω καθεξής.

Γενικά, οι χαρακτήρες που αποτελούν τη συμβολοσειρά μορφής χωρίζονται σε:

  • προσδιοριστές μορφής - οτιδήποτε ξεκινά με %;
  • διαχωρισμός ή χαρακτήρες διαστήματος - είναι space, tab(t), newline (n);
  • χαρακτήρες εκτός από κενό διάστημα.

Η λειτουργία μπορεί να μην είναι ασφαλής.

Χρησιμοποιήστε scanf_s() αντί για scanf().

(μήνυμα από το Visual Studio)

Προδιαγραφείς τύπου ή μορφής ή χαρακτήρες μετατροπής ή χαρακτήρες ελέγχου

δυάδικος κώδικας
δυάδικος κώδικας

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

Τύπος

Σημασία
1 %c Το πρόγραμμα περιμένει για εισαγωγή χαρακτήρων. Η μεταβλητή που θα γραφεί πρέπει να είναι του τύπου char.
2 %d Το πρόγραμμα αναμένει εισαγωγή δεκαδικού αριθμού ακέραιου τύπου. Η μεταβλητή πρέπει να είναι τύπου int.
3 %i Το πρόγραμμα αναμένει εισαγωγή δεκαδικού αριθμού ακέραιου τύπου. Η μεταβλητή πρέπει να είναι τύπου int.
4 %e, %E Το πρόγραμμα αναμένει να εισαγάγει έναν αριθμό κινητής υποδιαστολής (κόμμα) σε εκθετική μορφή. Η μεταβλητή πρέπει να είναι τύπου float.
5 %f Το πρόγραμμα αναμένει αριθμό κινητής υποδιαστολής (κόμμα). Η μεταβλητή πρέπει να είναι τύπου float.
6 %g, %G Το πρόγραμμα αναμένει αριθμό κινητής υποδιαστολής (κόμμα). Η μεταβλητή πρέπει να είναι τύπου float.
7 %a Το πρόγραμμα αναμένει αριθμό κινητής υποδιαστολής (κόμμα). Η μεταβλητή πρέπει να είναι τύπου float.
8 %o Το πρόγραμμα αναμένει έναν οκταδικό αριθμό. Η μεταβλητή πρέπει να είναι τύπου int.
9 %s Το πρόγραμμα περιμένει να εισαχθεί μια συμβολοσειρά. Μια συμβολοσειρά είναι ένα σύνολο χαρακτήρων μέχρι τον πρώτο διαχωριστικό χαρακτήρα που συναντήθηκε. Η μεταβλητή πρέπει να είναι τύπου string.
10 %x, %X Το πρόγραμμα περιμένει έναν δεκαεξαδικό αριθμό. Η μεταβλητή πρέπει να είναι τύπου int.
11 %p Η μεταβλητή αναμένει είσοδο δείκτη. Η μεταβλητή πρέπει να είναι τύπου δείκτη.
12 %n

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

13 %u Το πρόγραμμα διαβάζει έναν ανυπόγραφο ακέραιο. Ο τύπος μεταβλητής πρέπει να είναι ακέραιος χωρίς υπογραφή.
14 %b Το πρόγραμμα περιμένει έναν δυαδικό αριθμό. Η μεταβλητή πρέπει να είναι τύπου int.
15 % Σετ σαρωμένων χαρακτήρων. Το πρόγραμμα περιμένει την εισαγωγή χαρακτήρων.από την περιορισμένη ομάδα που καθορίζεται μεταξύ των αγκύλων. Το scanf θα λειτουργεί όσο υπάρχουν χαρακτήρες από το καθορισμένο σύνολο στη ροή εισόδου.
16 %% Υπογραφή "%".

Χαρακτήρες στη συμβολοσειρά μορφής

Κωδικός C++
Κωδικός C++

Σύμβολο αστεριού ()

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


scanf("%d%c%d", &x, &y); //αγνοήστε τον χαρακτήρα μεταξύ δύο ακεραίων. scanf("%s%d%s", str, str2); //αγνοήστε ακέραιο αριθμό μεταξύ δύο συμβολοσειρών.

Δηλαδή, εάν εισαγάγετε τη γραμμή "45-20" στην κονσόλα, το πρόγραμμα θα κάνει τα εξής:

  1. Στη μεταβλητή "x" θα εκχωρηθεί η τιμή 45.
  2. Στη μεταβλητή "y" θα εκχωρηθεί η τιμή 20.
  3. Και το σύμβολο μείον (παύλα) "-" θα αγνοηθεί χάρη στο "%c".

Πλάτος (ή πλάτος πεδίου)

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


scanf("%20s", str); //διαβάστε τους πρώτους 20 χαρακτήρες από τη ροή εισόδου

Υπάρχουν μερικά σημαντικά πράγματα που πρέπει να θυμάστε:

  1. Το scanf θα τερματιστεί αν συναντήσει διαχωριστικό χαρακτήρα, ακόμα κι αν δεν μετρούσε 20 χαρακτήρες.
  2. Εάν εισάγονται περισσότεροι από 20 χαρακτήρες, μόνο οι πρώτοι 20 χαρακτήρες θα γραφτούν στη str.

Τροποποιητέςτύπος (ή ακρίβεια)

κωδικός πιτσιλίσματος
κωδικός πιτσιλίσματος

Αυτές είναι ειδικές σημαίες που τροποποιούν τον τύπο των δεδομένων που αναμένεται για εισαγωγή. Η σημαία καθορίζεται στα αριστερά του προσδιοριστή τύπου:

  • L ή l (μικρό L) Όταν χρησιμοποιείται το "l" με τους προσδιοριστές d, i, o, u, x, η σημαία λέει στο πρόγραμμα ότι αναμένεται μεγάλη είσοδος. Όταν χρησιμοποιείται το "l" με τον προσδιοριστή e ή f, η σημαία λέει στο πρόγραμμα ότι θα πρέπει να αναμένει διπλή τιμή. Η χρήση του "L" λέει στο πρόγραμμα ότι αναμένεται ένα μακρύ διπλό. Η χρήση του "l" με τους προσδιοριστές "c" και "s" λέει στο πρόγραμμα ότι αναμένονται χαρακτήρες δύο byte όπως ο wchar_t. Για παράδειγμα, "%lc", "%ls", "%l[asd]".
  • Το h είναι μια σημαία που υποδεικνύει τον σύντομο τύπο.
  • ωω - υποδηλώνει ότι η μεταβλητή είναι δείκτης σε έναν υπογεγραμμένο χαρακτήρα ή μια τιμή χωρίς υπογραφή. Η σημαία μπορεί να χρησιμοποιηθεί με τους προσδιοριστές d, i, o, u, x, n.
  • ll (δύο μικρά L) - υποδηλώνει ότι η μεταβλητή είναι δείκτης σε μια τιμή τύπου με υπογραφή long long int ή unsigned long long int. Η σημαία χρησιμοποιείται με προσδιοριστές: d, i, o, u, x, n.
  • j - υποδηλώνει ότι η μεταβλητή είναι δείκτης στον τύπο intmax_t ή uintmax_t από το αρχείο κεφαλίδας stdint.h. Χρησιμοποιείται με προσδιοριστές: d, i, o, u, x, n.
  • z - υποδηλώνει ότι η μεταβλητή είναι δείκτης στον τύπο size_t, ο ορισμός του οποίου βρίσκεται στο stddef.h. Χρησιμοποιείται με προσδιοριστές: d, i, o, u, x, n.
  • t - υποδηλώνει ότι η μεταβλητή είναι δείκτης στον τύπο ptrdiff_t. Ορισμός σεαυτός ο τύπος είναι στο stddef.h. Χρησιμοποιείται με προσδιοριστές: d, i, o, u, x, n.

Σαφέστερα, η εικόνα με τροποποιητές μπορεί να αναπαρασταθεί ως πίνακας. Μια τέτοια περιγραφή του scanf C για προγραμματιστές θα είναι πιο ξεκάθαρη.

Τύποι Προδιαγραφείς και Τροποποιητές
Τύποι Προδιαγραφείς και Τροποποιητές

Άλλοι χαρακτήρες

Τυχόν χαρακτήρες που συναντώνται στη μορφή θα απορριφθούν. Ταυτόχρονα, πρέπει να σημειωθεί ότι η παρουσία κενού διαστήματος ή διαχωριστικών χαρακτήρων (νέα γραμμή, διάστημα, καρτέλα) στη συμβολοσειρά ελέγχου μπορεί να οδηγήσει σε διαφορετική συμπεριφορά της συνάρτησης. Σε μια έκδοση, το scanf() θα διαβάζει χωρίς να αποθηκεύει κανέναν αριθμό διαχωριστικών μέχρι να συναντήσει έναν χαρακτήρα διαφορετικό από το διαχωριστικό και σε μια άλλη έκδοση, τα κενά (μόνο αυτά) δεν παίζουν ρόλο και η έκφραση "%d + %d" ισοδυναμεί με "% d+%d".

Παράδειγμα κώδικα C++
Παράδειγμα κώδικα C++

Παραδείγματα

Ας δούμε μερικά παραδείγματα που θα σας βοηθήσουν να σκεφτείτε και να κατανοήσετε καλύτερα πώς λειτουργεί η συνάρτηση.


scanf("%3s", str); //αν εισαγάγετε τη συμβολοσειρά "1d2s3d1;3" στην κονσόλα, μόνο το "1d2" θα γραφτεί στο str scanf("%dminus%d", &x, &y); //μείον χαρακτήρες μεταξύ δύο αριθμών θα απορριφθούν scanf("%5[0-9]", str); // Οι χαρακτήρες θα εισαχθούν στο str μέχρι να υπάρχουν 5 χαρακτήρες και οι χαρακτήρες είναι αριθμοί από το 0 έως το 9. scanf("%lf", &d); //expect double input scanf("%hd", &x); //αναμενόμενος αριθμός τύπου short scanf("%hu", &y); //αναμένεται ανυπόγραφος αριθμός short scanf("lx", &z); //αναμενόμενος αριθμός τύπου long int

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

scanf C - περιγραφή για αρχάριους

Αυτή η ενότητα θα είναι χρήσιμη για αρχάριους. Συχνά δεν χρειάζεται να έχετε στη διάθεσή σας τόσο μια πλήρη περιγραφή του scanf C όσο τις λεπτομέρειες του τρόπου λειτουργίας της συνάρτησης.

  • Αυτή η δυνατότητα είναι κάπως ξεπερασμένη. Υπάρχουν πολλές διαφορετικές υλοποιήσεις σε βιβλιοθήκες διαφορετικών εκδόσεων. Για παράδειγμα, η βελτιωμένη λειτουργία σάρωσης S C, περιγραφή της οποίας βρίσκεται στον ιστότοπο της microsoft.
  • Ο αριθμός των προσδιοριστών στη μορφή πρέπει να ταιριάζει με τον αριθμό των ορισμάτων που διαβιβάζονται στη συνάρτηση.
  • Τα στοιχεία ροής εισόδου πρέπει να διαχωρίζονται μόνο με διαχωριστικούς χαρακτήρες: διάστημα, καρτέλα, νέα γραμμή. Κόμμα, ερωτηματικό, τελεία κ.λπ. - αυτοί οι χαρακτήρες δεν είναι διαχωριστικά για τη συνάρτηση scanf().
  • Εάν το scanf συναντήσει διαχωριστικό χαρακτήρα, η εισαγωγή θα διακοπεί. Εάν υπάρχουν περισσότερες από μία μεταβλητές προς ανάγνωση, τότε το scanf θα προχωρήσει στην ανάγνωση της επόμενης μεταβλητής.
  • Η παραμικρή ασυνέπεια στη μορφή δεδομένων εισόδου οδηγεί σε απρόβλεπτα αποτελέσματα του προγράμματος. Λοιπόν, εάν το πρόγραμμα τελειώνει με ένα σφάλμα. Αλλά συχνά το πρόγραμμα συνεχίζει να λειτουργεί και το κάνει λάθος.
  • scanf("%20s…", …); Εάν η ροή εισόδου υπερβαίνει τους 20 χαρακτήρες, τότε το scanf θα διαβάσει τους πρώτους 20 χαρακτήρες και είτε θα ματαιώσει είτε θα προχωρήσει στην ανάγνωση της επόμενης μεταβλητής, εάν έχει καθοριστεί μία. Σε αυτήν την περίπτωση, η επόμενη κλήση προς σάρωση θα συνεχίσει να διαβάζει τη ροή εισόδου από το σημείο όπου σταμάτησε η εργασία της προηγούμενης κλήσης προς σάρωση. Αν κατά την ανάγνωση των πρώτων 20χαρακτήρες, εμφανίζεται ένας χαρακτήρας οριοθέτησης, το scanf θα ματαιώσει ή θα συνεχίσει να διαβάζει την επόμενη μεταβλητή, ακόμα κι αν δεν διάβασε 20 χαρακτήρες για την πρώτη μεταβλητή. Σε αυτήν την περίπτωση, όλοι οι μη αναγνωσμένοι χαρακτήρες θα προσαρτηθούν στην επόμενη μεταβλητή.
  • Εάν το σύνολο των σαρωμένων χαρακτήρων ξεκινά με ένα "^", τότε το scanf θα διαβάσει τα δεδομένα μέχρι να συναντήσει έναν χαρακτήρα οριοθέτη ή έναν χαρακτήρα από το σύνολο. Για παράδειγμα, το "%[^A-E1-5]" θα διαβάζει δεδομένα από τη ροή έως ότου εμφανιστεί ένας από τους κεφαλαίους αγγλικούς χαρακτήρες από το Α έως το Ε ή έναν από τους αριθμούς από το 1 έως το 5.
  • Η συνάρτηση scanf C, όπως περιγράφεται, επιστρέφει έναν αριθμό ίσο με τον επιτυχή αριθμό εγγραφών σε μεταβλητές. Εάν το scanf γράψει 3 μεταβλητές, τότε το αποτέλεσμα επιτυχίας της συνάρτησης θα επιστρέψει τον αριθμό 3. Εάν το scanf δεν μπορούσε να γράψει καμία μεταβλητή, τότε το αποτέλεσμα θα είναι 0. Και, τέλος, εάν το scanf δεν μπορούσε να ξεκινήσει καθόλου για κάποιο λόγο, το το αποτέλεσμα θα είναι ΕΟΦ.
  • Αν η συνάρτηση scanf() έληξε λανθασμένα. Για παράδειγμα, scanf("%d", &x) - αναμενόταν ένας αριθμός, αλλά ελήφθησαν χαρακτήρες ως είσοδος. Η επόμενη κλήση scanf() θα ξεκινήσει στο σημείο της ροής εισόδου όπου έληξε η προηγούμενη κλήση συνάρτησης. Για να ξεπεραστεί αυτό το πρόβλημα, είναι απαραίτητο να απαλλαγείτε από τους χαρακτήρες του προβλήματος. Αυτό μπορεί να γίνει, για παράδειγμα, καλώντας το scanf("%s"). Δηλαδή, η συνάρτηση θα διαβάσει μια σειρά χαρακτήρων και θα την πετάξει. Με αυτόν τον δύσκολο τρόπο, μπορείτε να συνεχίσετε να εισάγετε τα απαραίτητα δεδομένα.
  • Σε ορισμένες υλοποιήσεις του scanf(), το "-" δεν επιτρέπεται στο σύνολο σαρωμένων χαρακτήρων.
  • Ο προσδιοριστής "%c" διαβάζει κάθε χαρακτήρα από τη ροή. Δηλαδή διαβάζει και τον διαχωριστικό χαρακτήρα. Για να παραλείψετε τον χαρακτήρα οριοθέτησης και να συνεχίσετε να διαβάζετε τον επιθυμητό χαρακτήρα, μπορείτε να χρησιμοποιήσετε το "%1s".
  • Όταν χρησιμοποιείτε τον προσδιοριστή "c", επιτρέπεται η χρήση του πλάτους "%10c", αλλά στη συνέχεια ένας πίνακας στοιχείων τύπου char πρέπει να μεταβιβαστεί ως μεταβλητή στη συνάρτηση scanf.
  • "%[a-z]" σημαίνει "όλα τα μικρά γράμματα του αγγλικού αλφαβήτου" και "%[z-a]" σημαίνει μόνο 3 χαρακτήρες: "z", "a", "-". Με άλλα λόγια, ο χαρακτήρας "-" σημαίνει ένα εύρος μόνο εάν είναι μεταξύ δύο χαρακτήρων που είναι στη σωστή σειρά. Εάν το "-" βρίσκεται στο τέλος μιας έκφρασης, στην αρχή ή σε λανθασμένη σειρά χαρακτήρων σε κάθε πλευρά τους, τότε είναι απλώς ένας χαρακτήρας παύλας, όχι ένα εύρος.
Κωδικός C++
Κωδικός C++

Συμπέρασμα

Αυτό ολοκληρώνει την περιγραφή του scanf C. Αυτό είναι ένα ωραίο εύχρηστο χαρακτηριστικό για εργασία σε μικρά προγράμματα και όταν χρησιμοποιείτε τη μέθοδο διαδικαστικού προγραμματισμού. Ωστόσο, το κύριο μειονέκτημα είναι ο αριθμός των απρόβλεπτων σφαλμάτων που μπορεί να προκύψουν κατά τη χρήση του scanf. Επομένως, η περιγραφή του scanf C κατά τον προγραμματισμό είναι καλύτερα να διατηρείται μπροστά στα μάτια σας. Σε μεγάλα επαγγελματικά έργα, τα iostreams χρησιμοποιούνται, λόγω του γεγονότος ότι έχουν δυνατότητες υψηλότερου επιπέδου, είναι καλύτερα σε θέση να πιάνουν και να χειρίζονται λάθη, καθώς και να εργάζονται με σημαντικές ποσότητες πληροφοριών. Θα πρέπει επίσης να σημειωθεί ότι η περιγραφή του scanf C στα ρωσικά είναι διαθέσιμη σε πολλές πηγές δικτύου, καθώς και παραδείγματαχρήση, λόγω της ηλικίας της λειτουργίας. Επομένως, εάν είναι απαραίτητο, μπορείτε πάντα να βρείτε την απάντηση στα θεματικά φόρουμ.

Συνιστάται:

Η επιλογή των συντακτών

Το ελαφρύτερο ελικόπτερο. Ελαφρά ρωσικά ελικόπτερα. Ελαφρά ελικόπτερα του κόσμου. Το ελαφρύτερο ελικόπτερο πολλαπλών χρήσεων

Απόλυτο αλκοόλ. Βιομηχανική παραγωγή αλκοόλης από βιολογικές πρώτες ύλες

Χάλυβας έλασης: τύποι, GOST, τιμές

Αφαλάτωση νερού: μέθοδοι και ρυθμίσεις

Επάγγελμα γλύπτης: περιγραφή, σημαντικές ιδιότητες, πλεονεκτήματα και μειονεκτήματα της δουλειάς

Κορυφαία εργοστάσια του Ομσκ και της περιοχής του Ομσκ: ιστορία και νεωτερικότητα

Αισθητήρας αερίου: περιγραφή, τύποι, κόστος

Βιογραφία του επιτυχημένου επιχειρηματία Mikail Shishkhanov

Αριθμός 444: έννοια και ιδιότητα

Ποιος είναι ο βέλτιστος άξονας για CNC;

Ισλαμική τραπεζική στη Ρωσία. Ισλαμική τράπεζα στη Μόσχα

Μελισσοκομία στην Ουκρανία: πώς να ξεκινήσετε την ανάπτυξη μιας επιχείρησης

Ζλότι - η νομισματική μονάδα της Πολωνίας

Ασκοσφαιρίωση των μελισσών: πρόληψη και θεραπεία

Αμερικανική αυτοκινητοβιομηχανία: ιστορία, εξέλιξη, τρέχουσα κατάσταση. αυτοκινητοβιομηχανία των ΗΠΑ