In Funktion mit variabler Anzahl von Argumenten wird das "erste Argument" als "Gesamtzahl der Argumente" übergeben. Aber in printf()
erwähnen wir nie Argumentanzahl. Also, wie erfährt es über die gesamte Argumentliste? Wie funktioniert printf()
?Wie funktioniert printf() ohne explizite Argumentanzahl
Antwort
Schauen wir uns auf printf
Vereinbarungsstruktur:
int printf(const char *format, ...)
format
ist eigentlich die Zeichenfolge, die den Text enthält, zu stdout
geschrieben werden.
Die enthaltenen eingebetteten Format-Tags werden später durch die in nachfolgenden zusätzlichen Argumenten angegebenen Werte ersetzt, und das Format wird entsprechend festgelegt.
Sie liefern keine Argumentanzahl an printf
- Sie liefern jedoch eine Format-Zeichenfolge - und das gibt an, wie viele Argumente printf
erwarten sollte.
Sehr grob gesprochen ist die Anzahl der %
Zeichen im Format String die Anzahl der Argumente (obwohl die Realität ein bisschen komplizierter ist).
Konvertierungsspezifizierer im String-Format printf
die Anzahl und Arten von Argumenten sagen, eserwarten sollte - beispielsweise die Formatstring "there are %d vowels in %s\n"
printf
erzählt zwei Argumente neben dem Format-String zu erwarten, der erste Typ ist int
und der zweite ist char *
.
Es liegt an Ihnen sicherzustellen, dass die Argumente mit der Formatzeichenfolge übereinstimmen. Wenn Sie nicht genügend Argumente übergeben oder die Argumenttypen nicht dem entsprechen, was die Formatzeichenfolge erwartet, lautet das Verhalten undefiniert (am wahrscheinlichsten verzerrte Ausgabe oder ein Laufzeitfehler). Wenn Sie zu viele Argumente übergeben, werden die zusätzlichen Argumente ausgewertet, aber ansonsten funktioniert die Funktion normal, solange die Formatzeichenfolge erfüllt ist.
bearbeiten
7.21.6.1 Diefprintf
Funktion
...
Diefprintf
Funktion schreibt Ausgabe an den Stream zu spitz durchstream
, unter der Kontrolle der Str Inkl. vonformat
, die angibt, wie nachfolgende Argumente für die Ausgabe konvertiert werden. Wenn für das Format nicht genügend Argumente vorhanden sind, ist das Verhalten nicht definiert. Wenn das Format bei verbleibenden Argumenten erschöpft ist, werden die überschüssigen Argumente (wie immer) ausgewertet, ansonsten aber ignoriert. Die Funktion fprintf wird zurückgegeben, wenn das Ende der Formatzeichenfolge gefunden wird.
Ich bin mir ziemlich sicher, dass dein letzter Satz irgendwo nicht * * * fehlt. – tofro
@tofro: siehe meine Bearbeitung. –
[Vielleicht kann das helfen] (https://www.eskimo.com/~scs/class/int/sx11b.html) –
Es gibt ein Argument für jeden Formatbezeichner (außer für %%) und für jeden * in einem Formatspezifizierer. – immibis
Vielleicht hilft das: https: //www.quora.com/How-is-printf-implementiert –