Λειτουργία Scanf C: περιγραφή. Εκμάθηση και χρήση των συναρτήσεων printf() και scanf().

Αυτό το άρθρο εξετάζει τη συνάρτηση 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δεν χρειάζεται να προσδιορίσετε το σύμβολο διεύθυνσης - "&", αφού μεταβλητή τύπουΗ συμβολοσειρά είναι ένας πίνακας και το όνομά του είναι η διεύθυνση του πρώτου στοιχείου του πίνακα στη μνήμη του υπολογιστή.

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

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

#περιλαμβάνω int main() ( int x; while (scanf("%d", &x) == 1) printf("%d\n", x); return 0; //απαίτηση για συστήματα linux )

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

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

  • προσδιοριστές μορφής - όλα όσα ξεκινούν με το σύμβολο %.
  • διαίρεση ή κενού χαρακτήρες- θεωρούνται χώρος, καρτέλα (\t), νέα γραμμή(\n);
  • χαρακτήρες εκτός από το κενό διάστημα.

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

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

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

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

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

Εννοια

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

Το πρόγραμμα αναμένει να εισαχθεί ένας ακέραιος δεκαδικός αριθμός. Η μεταβλητή πρέπει να είναι τύπου int.

Το πρόγραμμα αναμένει έναν αριθμό κινητής υποδιαστολής σε εκθετική μορφή. Η μεταβλητή πρέπει να είναι τύπου float.

Το πρόγραμμα αναμένει να εισαχθεί ένας αριθμός κινητής υποδιαστολής. Η μεταβλητή πρέπει να είναι τύπου float.

7

Το πρόγραμμα αναμένει να εισαχθεί ένας αριθμός κινητής υποδιαστολής. Η μεταβλητή πρέπει να είναι τύπου float.

Το πρόγραμμα αναμένει να εισαχθεί ένας οκταδικός αριθμός. Η μεταβλητή πρέπει να είναι τύπου int.

Το πρόγραμμα αναμένει να εισαχθεί μια συμβολοσειρά. Μια συμβολοσειρά θεωρείται ότι είναι ένα σύνολο χαρακτήρων μέχρι τον πρώτο χαρακτήρα οριοθέτη που συναντάται. Η μεταβλητή πρέπει να είναι τύπου string.

Το πρόγραμμα περιμένει εισαγωγή δεκαεξαδικός αριθμός. Η μεταβλητή πρέπει να είναι τύπου int.

Η μεταβλητή αναμένει μια είσοδο δείκτη. Η μεταβλητή πρέπει να είναι τύπος δείκτη.

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

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

Το πρόγραμμα περιμένει εισαγωγή δυάδικος αριθμός. Η μεταβλητή πρέπει να είναι τύπου int.

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

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

Αστερίσκος (*)

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

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

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

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

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

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

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

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

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

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

  • L ή l (μικρό L) Όταν χρησιμοποιείται το "l" με τους προσδιοριστές d, i, o, u, x, η σημαία λέει στο πρόγραμμα να αναμένει είσοδο τύπου long int. Όταν χρησιμοποιείται το "l" με τον προσδιοριστή e ή f, η σημαία λέει στο πρόγραμμα ότι θα πρέπει να αναμένει να εισαχθεί διπλή τιμή. Η χρήση του "L" λέει στο πρόγραμμα ότι αναμένεται μια τιμή τύπου long double. Η χρήση του "l" με τους προσδιοριστές "c" και "s" λέει στο πρόγραμμα ότι αναμένονται χαρακτήρες διπλού byte τύπου wchar_t. Για παράδειγμα, "%lc", "%ls", "%l".
  • h είναι μια σημαία που υποδεικνύει τον τύπο short.
  • hh - υποδηλώνει ότι η μεταβλητή είναι δείκτης σε μια τιμή τύπου signed char ή unsigned char. Η σημαία μπορεί να χρησιμοποιηθεί με τους προσδιοριστές d, i, o, u, x, n.
  • ll (δύο μικρά L) - υποδηλώνει ότι η μεταβλητή είναι δείκτης σε μια τιμή τύπου signed 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".

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

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

Scanf("%3s", str); //αν εισαγάγετε τη γραμμή "1d2s3d1;3" στην κονσόλα, μόνο το "1d2" θα γραφτεί στο str scanf("%dminus%d", &x, &y); //μείον χαρακτήρες μεταξύ δύο αριθμών θα απορριφθούν scanf("%5", str); //οι χαρακτήρες θα εισαχθούν στο str έως ότου υπάρχουν 5 από αυτούς και οι χαρακτήρες είναι αριθμοί από το 0 έως το 9. scanf("%lf", &d); //αναμενόμενη είσοδος τύπου double scanf("%hd", &x); //αναμένεται ένας αριθμός τύπου short scanf("%hu", &y); //αναμένεται ένας αριθμός τύπου unsigned 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]" θα διαβάσει δεδομένα από τη ροή έως ότου εμφανιστεί ένας από τους κεφαλαίους αγγλικούς χαρακτήρες A έως E ή ένας από τους αριθμούς 1 έως 5.
  • Η συνάρτηση scanf C, όπως περιγράφεται, επιστρέφει έναν αριθμό ίσο με τον επιτυχή αριθμό των καταχωρήσεων σε μεταβλητές. Αν το scanf γράψει 3 μεταβλητές, τότε το αποτέλεσμα είναι επιτυχημένη δουλειάΗ συνάρτηση θα επιστρέψει τον αριθμό 3. Εάν το scanf δεν μπορούσε να γράψει καμία μεταβλητή, τότε το αποτέλεσμα θα είναι 0. Και τέλος, εάν το scanf δεν μπορούσε να αρχίσει να λειτουργεί καθόλου για κάποιο λόγο, το αποτέλεσμα θα είναι EOF.
  • Εάν η συνάρτηση scanf() ολοκλήρωσε την εργασία της λανθασμένα. Για παράδειγμα, scanf("%d", &x) - αναμενόταν ένας αριθμός, αλλά ελήφθησαν σύμβολα ως είσοδος. Η επόμενη κλήση scanf() θα ξεκινήσει από το σημείο στη ροή εισόδου όπου έληξε η προηγούμενη κλήση συνάρτησης. Για να ξεπεράσετε αυτό το πρόβλημα, πρέπει να απαλλαγείτε από τους προβληματικούς χαρακτήρες. Αυτό μπορεί να γίνει, για παράδειγμα, καλώντας το scanf("%*s"). Δηλαδή, η συνάρτηση θα διαβάσει μια σειρά χαρακτήρων και θα την πετάξει. Με αυτόν τον έξυπνο τρόπο, μπορείτε να συνεχίσετε να εισάγετε τα απαιτούμενα δεδομένα.
  • Ορισμένες υλοποιήσεις του scanf() δεν επιτρέπουν τη χρήση του "-" στο σύνολο χαρακτήρων για σάρωση.
  • Ο προσδιοριστής "%c" διαβάζει κάθε χαρακτήρα από τη ροή. Δηλαδή διαβάζει και τον χαρακτήρα οριοθέτη. Για να παραλείψετε τον χαρακτήρα οριοθέτησης και να συνεχίσετε να διαβάζετε τον επιθυμητό χαρακτήρα, μπορείτε να χρησιμοποιήσετε το "%1s".
  • Όταν χρησιμοποιείτε τον προσδιοριστή "c", είναι αποδεκτό να χρησιμοποιήσετε το πλάτος "%10c", αλλά στη συνέχεια στη μορφή μεταβλητή συνάρτηση scanf πρέπει να περάσετε μια σειρά από στοιχεία τύπου char.
  • Το "%" σημαίνει "όλα τα μικρά γράμματα του αγγλικού αλφαβήτου" και το "%" σημαίνει απλά 3 χαρακτήρες: "z", "a", "-". Με άλλα λόγια, το σύμβολο "-" σημαίνει ένα εύρος μόνο εάν εμφανίζεται μεταξύ δύο χαρακτήρων που είναι μέσα με τη σωστή σειράΕΠΟΜΕΝΟ. Εάν το "-" βρίσκεται στο τέλος μιας έκφρασης, στην αρχή ή σε λάθος σειρά χαρακτήρων σε κάθε πλευρά τους, τότε απλώς αντιπροσωπεύει έναν χαρακτήρα παύλας, όχι ένα εύρος.

συμπέρασμα

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

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

scanf

Στη γλώσσα C, εκτός από τη λειτουργία εξόδου printf, υπάρχει και λειτουργία σάρωσηςγια εισαγωγή. Θα εξετάσουμε τώρα τη λειτουργία σάρωσης με περισσότερες λεπτομέρειες:

int i?
scanf("%d", &i);

Φαίνεται πολύ παρόμοια με τη λειτουργία printf. Διατίθεται επίσης σε διπλά εισαγωγικά προσδιοριστής μορφής, αλλά η διαφορά βρίσκεται ακριβώς στο δεύτερο μέρος της συνάρτησης. Προσέξατε το σημάδι (&); Άρα αυτό το σημάδι σημαίνει λήψη της διεύθυνσης. Τώρα θα εξηγήσω γιατί αυτό χρειάζεται.

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

Προσδιοριστές μορφής

Λοιπόν, πάμε τώρα προσδιοριστές μορφής:
  1. %d - διαβάστε έναν ακέραιο
  2. int i?
    scanf("%d", &i);

  3. %o - διαβάστε οκταδικός αριθμός
  4. int i?
    scanf("%o", &i);

  5. %x - ανάγνωση δεκαεξαδικού αριθμού
  6. int i?
    scanf("%x", &i);

  7. %e(%f) - διαβάστε έναν πραγματικό αριθμό
  8. float t?
    scanf("%f", &t);

  9. %s - ανάγνωση χαρακτήρα
  10. char ch;
    scanf("%c", &ch);

  11. %s - γραμμή ανάγνωσης
  12. char *str;;
    scanf("%s", str);

    Μην ασχολείστε ακόμα με τις χορδές. Γιατί δεν υπάρχει πινακίδα διεύθυνσης; Θα εξετάσουμε αυτό το θέμα λίγο αργότερα.

Λειτουργίες σύγκρισης

Ο υπολογιστής είναι αρχικά κατασκευασμένος με λογική Boolean, δηλ. όλα είναι χτισμένα στο 0 και το 1. Εάν δεν καταλαβαίνετε για τι πράγμα μιλάμε, τότε δείτε την ταινία The Matrix, όπου κάθε πράσινη προφύλαξη οθόνης αποτελούνταν από αυτούς τους δύο μαγικούς αριθμούς.

Φυσικά, το 0 και το 1 είναι καλά, αλλά χρειαζόμαστε λογική σημασία, οπότε μέσα λογικές πράξειςΤο 0 είναι FALSE και το 1 είναι TRUE. Αυτές οι έννοιες TRUE και FALSE σχετίζονται στενά με εργασίες σύγκρισης. Αρχικά, παρουσιάζουμε διάφορες λειτουργίες σύγκρισης:

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

Η συνάρτηση 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 εάν το πρόγραμμα έχει μεταγλωττιστεί για το μοντέλο τεράστιας μνήμης.)

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

Η είσοδος και η έξοδος πληροφοριών πραγματοποιείται μέσω λειτουργιών τυπική βιβλιοθήκη. Τα πρωτότυπα των εν λόγω συναρτήσεων βρίσκονται στο αρχείο stdio.h. Αυτή η βιβλιοθήκη περιέχει λειτουργίες

  • printf() - για εμφάνιση πληροφοριών
  • scanf() - για την εισαγωγή πληροφοριών.

Έξοδος πληροφοριών

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

Η γενική μορφή γραφής της συνάρτησης printf() είναι:

printf( "FormatString", αντικείμενο1, αντικείμενο2, ..., αντικείμενο);

Η γραμμή Μορφή αποτελείται από τα ακόλουθα στοιχεία:

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

Μπορεί να λείπουν αντικείμενα.

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

Βασικοί χαρακτήρες ελέγχου:

  • "\n" - ροή γραμμής.
  • '\t' - οριζόντια καρτέλα.
  • '\v' - κάθετη καρτέλα.
  • '\b' - επιστροφή στον χαρακτήρα.
  • '\r' - επιστροφή στην αρχή της γραμμής.
  • '\a' - ηχητικό σήμα.

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

  • %d - ακέραιος πληκτρολογήστε intμε είσοδο μετρικό σύστημαλογισμός;
  • %u - ακέραιος ανυπόγραφος τύπος int.
  • %x - υπογεγραμμένος ακέραιος αριθμός δεκαεξαδικό σύστημαλογισμός;
  • %o - υπογεγραμμένος ακέραιος αριθμός οκταδικό σύστημαλογισμός;
  • %hd - υπογεγραμμένος σύντομος ακέραιος σε δεκαδικό σύστημα αριθμών.
  • %hu - ανυπόγραφος σύντομος ακέραιος αριθμός;
  • %hx - υπογεγραμμένος σύντομος ακέραιος σε δεκαεξαδικό συμβολισμό.
  • %ld - long int ακέραιος σε δεκαδικό σύστημα αριθμών.
  • %lu - ανυπόγραφο long int;
  • %lx - υπογεγραμμένος ακέραιος long int στο δεκαεξαδικό σύστημα αριθμών.
  • %f - πραγματική μορφή (αριθμοί κινητής υποδιαστολής τύπου float).
  • %lf - πραγματική μορφή διπλής ακρίβειας (αριθμοί κινητής υποδιαστολής διπλού τύπου).
  • %e - πραγματική μορφή σε εκθετική μορφή (οι αριθμοί κινητής υποδιαστολής του τύπου επιπλέουν σε εκθετική μορφή).
  • %c - μορφή χαρακτήρων.
  • %s - μορφή συμβολοσειράς.

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

1
2
3
4
5
6
7
8
9
10

#περιλαμβάνω
int main()
{
int a = 5;
float x = 2,78;
printf("a=%d\n" , a);
printf("x=%f\n" , x);
getchar();
επιστροφή 0;
}

Αποτέλεσμα του προγράμματος

Ο ίδιος κωδικός μπορεί να αναπαρασταθεί χρησιμοποιώντας μία κλήση printf:

1
2
3
4
5
6
7
8
9

#περιλαμβάνω
int main()
{
int a = 5;
float x = 2,78;
printf("a=%d\nx=%f\n" , a, x);
getchar();
επιστροφή 0;
}

Πινακοποιημένη έξοδος

Όταν προσδιορίζετε τη μορφή, μπορείτε ρητάαναφέρετε τον συνολικό αριθμό των γνωστών και τον αριθμό των γνωστών που καταλαμβάνει το κλασματικό μέρος:

1
2
3
4
5
6
7
8

#περιλαμβάνω
int main()
{
float x = 1,2345;
printf("x=%10.5f\n" , x);
getchar();
επιστροφή 0;
}


Αποτέλεσμα εκτέλεσης

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


Εισαγωγή πληροφοριών

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

scanf ("FormatString", διεύθυνση1, διεύθυνση2,...);

Η συμβολοσειρά μορφής είναι παρόμοια με τη συνάρτηση printf().
Για τον σχηματισμό της διεύθυνσης μιας μεταβλητής, χρησιμοποιείται το σύμβολο συμπλεκτικού συμβολικού «&»:
διεύθυνση = &αντικείμενο

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

Παράδειγμα στο Γ

1
2
3
4
5
6
7
8
9
10
11
12
13
14

// για να μπορείτε να χρησιμοποιήσετε scanf
#περιλαμβάνω
#περιλαμβάνω // για μετάβαση στα ρωσικά
int main()
{
float y;
system("chcp 1251" ); // μετάβαση στα ρωσικά στην κονσόλα
system("cls" ); // εκκαθάριση του παραθύρου της κονσόλας
printf("Εισαγάγετε y: " ); // εμφάνιση μηνύματος
scanf("%f" , &y); // εισάγετε τις τιμές της μεταβλητής y
printf( "Τιμή μεταβλητής y=%f", y); // εμφανίζει την τιμή της μεταβλητής y
getchar(); getchar();
επιστροφή 0;
}


Αποτέλεσμα του προγράμματος:

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

#define _CRT_SECURE_NO_WARNINGS

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

1
2
3
4
5
6
7
8
9
10

#περιλαμβάνω
int main()
{
int a?
printf("a = ");
scanf_s("%d" , &a);
printf("a = %d" ,a);
getchar(); getchar();
επιστροφή 0;
}

Ετικέτες: Μορφοποιημένη είσοδος, μορφοποιημένη έξοδος, printf, scanf, fgets, getch, συμβολοσειρά μορφής, προσδιοριστής μορφής, σημαίες, χαρακτήρες ελέγχου.

Μορφοποιημένη έξοδος

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

Η μορφοποιημένη συνάρτηση εξόδου printf λαμβάνει ως ορίσματα τη συμβολοσειρά μορφοποίησης και τα ορίσματα που θα εκτυπωθούν σύμφωνα με τη μορφή και επιστρέφει τον αριθμό των χαρακτήρων που εκτυπώθηκαν. Σε περίπτωση σφάλματος, επιστρέφει μια αρνητική τιμή και ορίζει την τιμή σε ferror. Εάν προέκυψαν πολλά σφάλματα, το σφάλμα είναι EILSEQ.
int printf(const char * format, ...);

#περιλαμβάνω #περιλαμβάνω void main() ( //η συνάρτηση δεν λαμβάνει άλλα ορίσματα εκτός από τη συμβολοσειρά printf("Hello world"); getch(); )

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

Γενική σύνταξη προσδιοριστή μορφής
Προσδιοριστής %[flags][width][.precision][length]
Ο προσδιοριστής είναι ο περισσότερος σημαντικό συστατικό. Καθορίζει τον τύπο της μεταβλητής και τον τρόπο εξόδου της.

Αυτί. 1 Προσδιοριστής τύπου.
Προσδιοριστής Τι θέλουμε να βγάλουμε; Παράδειγμα
δ ή θ Ακέραιος αριθμός με είσοδο δεκαδικός 392
u Ανυπόγραφος ακέραιος σε δεκαδικό συμβολισμό 7235
ο Ανυπόγραφο σε οκταδικό 657
Χ Ανυπόγραφος ακέραιος σε δεκαεξαδικό 7fa
Χ Ανυπόγραφος ακέραιος σε δεκαεξαδικό, κεφαλαία 7FA
f ή F Αριθμός κινητής υποδιαστολής 3.4563745
μι Επιστημονική φόρμα για αριθμούς κινητής υποδιαστολής 3,1234e+3
μι Εκθετική μορφή αριθμού κινητής υποδιαστολής, κεφαλαία 3,1234E+3
σολ Συντομότερη αναπαράσταση των μορφών f και e 3.12
σολ Συντομότερη αναπαράσταση των μορφών F και E 3.12
ένα Δεκαεξαδική αναπαράσταση αριθμού κινητής υποδιαστολής -0xc.90fep-2
ΕΝΑ Δεκαεξαδική παράσταση κινητής υποδιαστολής, κεφαλαία -0xc.90FEP-2
ντο Γράμμα ένα
μικρό Συμβολοσειρά (μηδενικός τερματικός πίνακας γραμμάτων) Γειά σου Κόσμε
Π Διεύθυνση δείκτη b8000000
n Δεν τυπώνει τίποτα. Το όρισμα πρέπει να είναι δείκτης σε υπογεγραμμένο int. Ο αριθμός των γραμμάτων που εκτυπώθηκαν πριν από τη συνάντηση %n θα αποθηκευτεί σε αυτήν τη διεύθυνση
% Δύο διαδοχικά ποσοστά εμφανίζουν σύμβολο ποσοστού %

#περιλαμβάνω #περιλαμβάνω void main() ( int a = 0x77, b = -20; char c = "F"; float f = 12.2341524; double d = 2e8; char* string = "Hello, World!"; printf("%s\n ", string); printf("a = %d, b = %d\n", a, b); printf("a = %u, b = %u\n", a, b); printf(" a = %x, b = %X\n", a, b); printf("dec a = %d, oct a = %o, hex a = %x\n", a, a, a); printf ("floating point f = %f, exp f = %e\n", f, f printf("double d = %f or %E\n", d, d); );

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

Αυτί. 4 Ακρίβεια.
.Ακρίβεια Περιγραφή
.αριθμός Για ακέραιους προσδιοριστές (d, i, o, u, x, X), η ακρίβεια καθορίζει τον ελάχιστο αριθμό χαρακτήρων που πρέπει να εξάγονται. Εάν η τιμή είναι μικρότερη, τότε εκτυπώνονται μηδενικά πριν από τον αριθμό. Η τιμή δεν περικόπτεται ακόμα και αν είναι μεγαλύτερη. Μια ακρίβεια 0 σημαίνει ότι δεν βγαίνει τίποτα για μια τιμή 0.
Για προσδιοριστές κινητής υποδιαστολής (a, A, e, E, f, F), αυτός είναι ο αριθμός των ψηφίων που πρέπει να εκτυπωθούν μετά την υποδιαστολή (προεπιλογή 6).
Για τα g και G, αυτός είναι ο αριθμός των σημαντικών ψηφίων που πρέπει να εξάγονται.
Για s - εμφανίζεται ο καθορισμένος αριθμός χαρακτήρων. Από προεπιλογή, εμφανίζονται όλοι οι χαρακτήρες μέχρι το αρχικό μηδέν.
Εάν ο αριθμός δεν υπάρχει, τότε η προεπιλεγμένη ακρίβεια είναι 0
.* Η ακρίβεια δεν καθορίζεται στη συμβολοσειρά μορφής, μεταβιβάζεται ξεχωριστά ως όρισμα, το οποίο πρέπει να προηγείται του αριθμού εξόδου

#περιλαμβάνω #περιλαμβάνω void main() ( int a = 0x77, b = -20; char c = "F"; float f = 12.2341524; double d = 2e2; char* string = "Hello, World!"; printf("%.3f\ n", f); printf("%.*f\n", 2, f); printf("%010.3f\n", d); printf("%*d\n", 6, a); printf("%+d\n", b); getch();

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

Αυτί. 5 Μήκος.
προσδιοριστές
Μήκος δ, θ u o x X f F e E g G a A ντο μικρό Π n
(κανένας) ενθ ανυπόγραφο ενθ διπλό ενθ απανθρακώνω* κενός* int*
ωω υπογεγραμμένο χαρ ανυπόγραφο χαρ υπογεγραμμένο χαρ*
η σύντομη εσωτ ανυπόγραφο σύντομο ενθ σύντομη εισαγωγή*
μεγάλο μακρύς ενθ ανυπόγραφο μακρύ ενθ Wint_t wchar_t* long int*
ll μακρά μακρά ενθ ανυπόγραφο μακρύ μακρύ ενθ μακρύ μακρύ εσωτερικ*
ι intmax_t uintmax_t intmax_t*
z μέγεθος_t μέγεθος_t μέγεθος_t*
t ptrdiff_t ptrdiff_t ptrdiff_t*
μεγάλο μακρύ διπλό

#περιλαμβάνω #περιλαμβάνω void main() ( long long x = 12300000000579099123; short i = 10; printf("%llu\n", x); printf("%d\n", i); printf("%hd\n", i getch();

Μορφοποιημένη είσοδος

Ας δούμε τη μορφοποιημένη είσοδο χρησιμοποιώντας τη λειτουργία σάρωσης.
int scanf(const char*, ...)
Η συνάρτηση δέχεται μια συμβολοσειρά μορφής εισόδου (είναι παρόμοια με τη συμβολοσειρά μορφής printf) και διευθύνσεις στις οποίες πρέπει να εγγραφούν τα δεδομένα ανάγνωσης. Επιστρέφει τον αριθμό των ορισμάτων που αρχικοποιήθηκαν με επιτυχία.
Μορφή προσδιοριστή εισόδου
%[*][width][length]προκριματικό

Αυτί. 6 Προσδιοριστής τύπου.
Προσδιοριστής Περιγραφή Επιλεγμένοι χαρακτήρες
εγώ, u Ολόκληρος Οποιοσδήποτε αριθμός ψηφίων (0-9), αρχίζοντας πιθανώς με + ή -. Εάν ο αριθμός ξεκινά με 0, τότε διαβάζεται σε οκταδική μορφή, αν ξεκινά με 0x, τότε σε δεκαεξαδικό.
ρε Δεκαδικός ακέραιος αριθμός Οποιοσδήποτε αριθμός ψηφίων (0-9), αρχίζοντας πιθανώς με + ή -.
ο οκταδικός ακέραιος αριθμός Οποιοσδήποτε αριθμός ψηφίων (0-7), αρχίζοντας πιθανώς με + ή -.
Χ Δεκαεξαδικός ακέραιος Ένας αυθαίρετος αριθμός ψηφίων (0-F), που πιθανόν να ξεκινά με + ή - και με πρόθεμα 0x ή 0X.
στ, ε, ζ Αριθμός κινητής υποδιαστολής Ένας αριθμός που αποτελείται από ένα σύνολο ψηφίων 0-9, πιθανώς με δεκαδικό διαχωριστικό (κουκκίδα). Είναι επίσης δυνατή η αναπαράστασή του σε εκθετική μορφή. Το C99 σας επιτρέπει επίσης να εισάγετε έναν αριθμό σε δεκαεξαδική μορφή.
ένα
ντο Σύμβολο Εάν το πλάτος δεν περάσει, τότε διαβάζει έναν χαρακτήρα. Εάν περάσει το πλάτος, τότε διαβάζει τον απαιτούμενο αριθμό χαρακτήρων και τους τοποθετεί στον πίνακα ΧΩΡΙΣ τον τερματικό χαρακτήρα στο τέλος.
μικρό Γραμμή Διαβάζει όλους τους χαρακτήρες χωρίς κενά. Εάν έχει καθοριστεί πλάτος, τότε όχι περισσότεροι από n χαρακτήρες. Αντικαθιστά n+1 τερματικούς χαρακτήρες.
Π Διεύθυνση δείκτη Μια ακολουθία χαρακτήρων που ερμηνεύεται ως διεύθυνση δείκτη. Η μορφή εξαρτάται από την υλοποίηση, αλλά είναι ίδια με αυτή που εξάγει το printf με την επιλογή p
[χαρακτήρες] Πολλά σύμβολα Διαβάζει μόνο τους χαρακτήρες που είναι γραμμένοι αγκύλες, C99
[^χαρακτήρες] Πολλά σύμβολα Διαβάζει μόνο τους χαρακτήρες που δεν προσδιορίζονται σε αγκύλες, C99
n Δεν διαβάζει τίποτα Αποθηκεύει τον αριθμό των χαρακτήρων που έχουν ήδη διαβαστεί στην καθορισμένη διεύθυνση

Όπως στο printf, πλάτος, δίνεται με σύμβολο* αναμένει ένα όρισμα που καθορίζει το πλάτος. Η σημαία μήκους είναι ίδια με τη σημαία της συνάρτησης printf.

#περιλαμβάνω #περιλαμβάνω void main() ( int έτος, μήνας, ημέρα, char buffer, int count; //Απαιτείται μορφοποιημένη είσοδος, για παράδειγμα 2013:12:12 printf("Εισαγάγετε δεδομένα όπως x:x:x = "); scanf("% d :%d:%d", &έτος, &μήνας, &ημέρα); printf("έτος = %d\nμήνας = %d, ημέρα = %d\n", έτος, μήνας, ημέρα); //Διαβάστε τη γραμμή, όχι περισσότερους από 127 χαρακτήρες Κατά την ανάγνωση σε έναν πίνακα, δεν χρειάζεται να γράψετε &, //καθώς ο πίνακας αντικαθίσταται από έναν δείκτη printf("Enter string" scanf("%127s", printf(); "%s", getch( )

Εκτός από τις λειτουργίες scanf και printf, υπάρχει μια σειρά από λειτουργίες που σας επιτρέπουν να λαμβάνετε δεδομένα εισόδου

int getch()- επιστρέφει τον χαρακτήρα που εισαγάγατε, αλλά δεν τον εξάγει στην κονσόλα. #περιλαμβάνω #περιλαμβάνω void main() (char c = 0; do (c = getch(); printf("%c", c); ) while (c != "q"); )

char * fgets (char * str, int num, FILE * stream)- η λειτουργία σάς επιτρέπει να διαβάζετε μια συμβολοσειρά με χαρακτήρες κενού διαστήματος. Αν και λειτουργεί με ένα αρχείο, μπορεί επίσης να χρησιμοποιηθεί για ανάγνωση από την τυπική ροή εισόδου. Το πλεονέκτημά του έναντι των gets είναι ότι σας επιτρέπει να καθορίσετε μέγιστο μέγεθοςη γραμμή που διαβάζεται και τελειώνει τη γραμμή με έναν τερματικό χαρακτήρα.

#περιλαμβάνω #περιλαμβάνω #περιλαμβάνω void main() ( char buffer; //Ανάγνωση από τυπική είσοδο fgets(buffer, 127, stdin); printf("%s", buffer); //Αυτό μπορεί να αντικαταστήσει την αναμονή για εισαγωγή χαρακτήρα scanf("1" )

Δεν είναι πλήρες σετ διάφορες λειτουργίεςεισαγωγή και έξοδος χαρακτήρων. Υπάρχουν πολλές τέτοιες λειτουργίες, αλλά πολλές από αυτές δεν είναι ασφαλείς, επομένως διαβάστε προσεκτικά την τεκμηρίωση πριν τις χρησιμοποιήσετε.