Συμβολοσειρά σε μορφή printf

Από The Stelios Files

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

Το "printf" είναι το όνομα μιας από τις κύριες συναρτήσεις εξόδου C και σημαίνει "print formatted". Οι συμβολοσειρές μορφής printf είναι συμπληρωματικές με τις συμβολοσειρές μορφής scanf , οι οποίες παρέχουν μορφοποιημένη είσοδο (lexing ή parsing). Και στις δύο περιπτώσεις αυτές παρέχουν απλή λειτουργικότητα και σταθερή μορφή σε σύγκριση με πιο εξελιγμένες και ευέλικτες μηχανές προτύπων ή lexers/parsers, αλλά επαρκούν για πολλούς σκοπούς.

1 Προδιαγραφές μορφοποίησης κράτησης θέσης

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

printf ( "Η ηλικία σας είναι %d" , ηλικία);

1.1 Σύνταξη

Η σύνταξη για ένα σύμβολο κράτησης θέσης μορφής είναι %[ παράμετρος ][ σημαίες ][ πλάτος ][. ακρίβεια ][ μήκος ] τύπος

1.2 Παράμετρος

Το πεδίο Παράμετρος μπορεί να παραλειφθεί ή μπορεί να είναι:

Χαρακτήρας Περιγραφή
n $ Το n είναι ο αριθμός της παραμέτρου που θα εμφανιστεί χρησιμοποιώντας αυτόν τον προσδιοριστή μορφής, επιτρέποντας στις παρεχόμενες παραμέτρους να εξάγονται πολλές φορές, χρησιμοποιώντας διαφορετικούς προσδιοριστές μδηλώνει πόσες φορές θα εμφανιστεί η παράμετρος χρησιμοποιώντας αυτόν τον προσδιοριστή μορφής, επιτρέποντας στις παρεχόμενες παραμέτρους να εξάγονται πολλές φορές, χρησιμοποιώντας διαφορετικούς προσδιοριστές μορφής ή με διαφορετικές σειρές. Εάν ένα μεμονωμένο σύμβολο κράτησης θέσης καθορίζει μια παράμετρο, όλα τα μέλη ΠΡΕΠΕΙ να καθορίσουν επίσης μια παράμετρο. Για παράδειγμα,
printf("%2$d %2$#x; %1$d %1$#x",16,17)
παράγει
17 0x11; 16 0x10


1.3 Σημαία

Το πεδίο Σημαίες μπορεί να είναι μηδέν ή περισσότερο (με οποιαδήποτε σειρά) από:

Χαρακτήρας Περιγραφή
-(μείον) Ευθυγράμμιση αριστερά της εξόδου αυτού του σύμβολου κράτησης θέσης. (Η προεπιλογή είναι η ευθυγράμμιση της εξόδου δεξιά.)
+(συν) Προβάλλει το πρόσημο. θετικό = + , αρνητικό = - .(Η προεπιλογή δεν προβάλλει τίποτα μπροστά από θετικούς αριθμούς.)
(διάστημα) Προβάλλει ένα κενό για θετικούς αριθμούς. θετικό = , αρνητικό = -.

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

0 (μηδέν) Όταν καθορίζεται η επιλογή 'πλάτος', προβάλλει μηδενικά στους αριθμητικούς τύπους. (Η προεπιλογή κενά κενά.)Για παράδειγμα,
printf("%4X",3)
παράγει 3, ενώ
printf("%04X",3)
παράγει 0003.
(‘) απόστροφος Εφαρμόζει το διαχωριστικό ομαδοποίησης χιλιάδων σε ακέραιους ή εκθέτες ενός δεκαδικού.
#(hash) Εναλλακτική μορφή:Για g και G τύπους, τα μη σημαντικά μηδενικά δεν αφαιρούνται.Για f , F , ε , Ε , g , G τύπους, η έξοδος περιέχει πάντα μια υποδιαστολή.Για o , x , Χ τύπους, το κείμενο 0 , 0x , 0X αντίστοιχα, προσαρτάται σε μη μηδενικούς αριθμούς.

1.4 Πλάτος

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

Το πεδίο πλάτους μπορεί να παραλειφθεί ή να μεταβιβαστεί μια αριθμητική ακέραια τιμή ή μια δυναμική τιμή ως άλλο όρισμα όταν υποδεικνύεται με αστερίσκο *. Για παράδειγμα, printf("%*d", 5, 10) θα έχει ως αποτέλεσμα 10 την εκτύπωση, με συνολικό πλάτος 5 χαρακτήρων.

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

1.5 Ακρίβεια

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

Το πεδίο ακριβείας μπορεί να παραλειφθεί ή να μεταβιβάζεται μια αριθμητική ακέραια τιμή ή μια δυναμική τιμή ως άλλο όρισμα όταν υποδεικνύεται με αστερίσκο *. Για παράδειγμα, printf("%.*s", 3, "abcdef") θα έχει ως αποτέλεσμα abc στην εκτύπωση.

1.6 Πεδίο μήκους

Το πεδίο Μήκος μπορεί να παραλειφθεί ή να είναι οποιοδήποτε από:

Χαρακτήρας Περιγραφή
hh Για ακέραιους τύπους, προκαλεί την printf να περιμένει ένα int ακέραιο όρισμα που προωθήθηκε από ένα char .
h Για ακέραιους τύπους, προκαλεί την printf να περιμένει ένα int ακέραιο όρισμα που προωθήθηκε από ένα short .
l Για ακέραιους τύπους, προκαλεί την printf να περιμένει ένα long ακέραιο όρισμα.

Για τύπους κινητής υποδιαστολής, αυτό αγνοείται. Τα ορίσματα float προωθούνται πάντα σε double όταν χρησιμοποιείται σε κλήση varargs.

ll Για ακέραιους τύπους, προκαλεί την printf να περιμένει ένα όρισμα long ακέραιο.
L Για τύπους κινητής υποδιαστολής, προκαλεί την printf να περιμένει ένα long double όρισμα.
z Για ακέραιους τύπους, προκαλεί την printf να περιμένει ένα size_t-sized ακέραιο όρισμα.
j Για ακέραιους τύπους, προκαλεί την printf να περιμένει ένα intmax_t-sized ακέραιο όρισμα.
t Για ακέραιους τύπους, προκαλεί την printf να περιμένει ένα ptrdiff_t -sized ακέραιο όρισμα.

1.7 Τύπος

Το πεδίο τύπος μπορεί να είναι οποιοδήποτε από:

Χαρακτήρας Περιγραφή
% Εκτυπώνει κατά γράμμα τον % χαρακτήρα (αυτός ο τύπος δεν δέχεται πεδία σημαίες, πλάτος, ακρίβεια, μήκος).
d , i int είναι προσημασμένος ακέραιος αριθμός . Τα %d και %i είναι συνώνυμα για την έξοδο, αλλά διαφέρει όταν χρησιμοποιείται με το scanf για είσοδο: όπου χρησιμοποιείται το %i θα ερμηνεύσει έναν αριθμό ως δεκαεξαδικό εάν προηγείται 0x και οκταδικό αν προηγείται 0.
u Εκτυπώνει δεκαδικό μη προσημασμένο ακέραιο.
f , F διπλό σε κανονική (σταθερού σημείου) σημειογραφία. Το f και F διαφέρουν μόνο στον τρόπο με τον οποίο εκτυπώνονται οι συμβολοσειρές για έναν άπειρο αριθμό ή NaN (inf, infinity and nan for f; INF, INFINITY and NAN for F).
e , E double σε τυπική μορφή (d.ddddd). Το E χρησιμοποιεί το γράμμα Ε (αντί e ) για την εισαγωγή του εκθέτη. Ο εκθέτης περιέχει πάντα τουλάχιστον δύο ψηφία. αν η τιμή είναι μηδέν, ο εκθέτης είναι 00 . Στα Windows, ο εκθέτης περιέχει τρία ψηφία από προεπιλογή, π.χ 1.5e002 , αλλά αυτό μπορεί να τροποποιηθεί από τη συγκεκριμένη λειτουργία της Microsoft _set_output_format.
g , G double είτε σε κανονική είτε σε εκθετική σημειογραφία, όποιο είναι καταλληλότερο για το μέγεθός του. Το g χρησιμοποιεί πεζά γράμματα, το G χρησιμοποιεί κεφαλαία γράμματα. Αυτός ο τύπος διαφέρει ελαφρώς από τον συμβολισμό σταθερού σημείου στο ότι δεν περιλαμβάνονται ασήμαντα μηδενικά στα δεξιά της υποδιαστολής. Επίσης, η υποδιαστολή δεν περιλαμβάνεται στους ακέραιους αριθμούς.
x , Χ Μη προσημασμένο int ως δεκαεξαδικός αριθμός. Το x χρησιμοποιεί πεζά γράμματα και tο X χρησιμοποιεί κεφαλαία.
ο Μη προσημασμένο int σε οκταδικό.
s Συμβολοσειρά που τερματίζεται με Null χαρακτήρα.
c char (χαρακτήρας).
p void* (δείκτης σε κενό) σε μορφή που καθορίζεται από την υλοποίηση.
a , A double σε δεκαεξαδικό συμβολισμό, ξεκινώντας από 0x ή 0Χ . Το a χρησιμοποιεί πεζά γράμματα, το A χρησιμοποιεί κεφαλαία γράμματα.
n Δεν εκτυπώνει τίποτα, αλλά γράφει τον αριθμό των χαρακτήρων που γράφτηκαν μέχρι στιγμής σε μια ακέραια παράμετρο δείκτη.Στην Java αυτό εκτυπώνει μια νέα γραμμή.