Ich weiß, dass Sie mit printf()
und drucken können puts()
. Ich kann auch sehen, printf()
dass Sie damit Variablen interpolieren und formatieren können.
Ist puts()
nur eine primitive Version von printf()
. Sollte es für jede mögliche printf()
ohne String-Interpolation verwendet werden?
printf(variable)
, um einen String zu drucken. Verwenden Sieputs(variable)
oderprintf("%s', variable)
. Die Verwendung einer Variablenformatzeichenfolge birgt ein Sicherheitsrisiko: Wenn die Variable von einem Angreifer geschrieben werden kann, kann er das Programm mithilfe von Formatzeichenfolgen angreifen.Antworten:
puts
ist einfacher als,printf
aber beachten Sie, dass die erstere automatisch eine neue Zeile anfügt. Wenn Sie dies nicht möchten, können Siefputs
Ihre Zeichenfolge stdout oder verwendenprintf
.quelle
(Dies wird in einem Kommentar von Zan Lynx hervorgehoben, aber ich denke, es verdient eine Antwort - da die akzeptierte Antwort es nicht erwähnt).
Der wesentliche Unterschied zwischen
puts(mystr);
undprintf(mystr);
besteht darin, dass das Argument in letzterem als Formatierungszeichenfolge interpretiert wird . Das Ergebnis wird oft die gleichen ( mit Ausnahme der zusätzlichen Newline) , wenn die Zeichenfolge enthält keine Steuerzeichen (%
) , aber wenn Sie nicht darauf verlassen können (wennmystr
Sie sollten eine Variable anstelle einer wörtlichen ist) nicht verwenden.Daher ist es im Allgemeinen gefährlich - und konzeptionell falsch -, eine dynamische Zeichenfolge als einzelnes Argument zu übergeben
printf
:Gleiches gilt für
fputs
vsfprintf
(fputs
fügt jedoch keine neue Zeile hinzu).quelle
printf()
weniger effizient? Zur Laufzeit? Zur Kompilierungszeit?printf
analysiert werden muss. Dies sollte jedoch normalerweise irrelevant sein. Außerdem könnte ein cleverer Compiler dies optimieren und denprintf
Aufruf vonputs
Gibt neben der Formatierung
puts
eine nichtnegative Ganzzahl zurück, wenn sie erfolgreich ist oderEOF
wenn sie nicht erfolgreich ist. whileprintf
gibt die Anzahl der gedruckten Zeichen zurück (ohne die nachfolgende Null).quelle
In einfachen Fällen konvertiert der Compiler Aufrufe
printf()
in Aufrufe anputs()
.Der folgende Code wird beispielsweise mit dem Assembler-Code kompiliert, den ich als Nächstes zeige.
In diesem Beispiel habe ich GCC Version 4.7.2 verwendet und die Quelle mit kompiliert
gcc -o hello hello.c
.quelle
printf("Hello world!\n");
tatsächlich sein sollen, dass gcc das in Puts übersetzt. Da es sich um eine alte Nachricht handelt, werde ich sie selbst bearbeiten.-save-temps
Option für gcc macht dasRichtig,
printf
könnte man sich als eine mächtigere Version von vorstellenputs
.printf
bietet die Möglichkeit, Format Variablen für die Ausgabe mit dem Formatbezeich wie%s
,%d
,%lf
, etc ...quelle
Nach meiner Erfahrung werden
printf()
mehr Code eingezogen alsputs()
unabhängig von der Formatzeichenfolge.Wenn ich die Formatierung nicht benötige, verwende ich sie nicht
printf
. Dochfwrite
bisstdout
arbeitet viel schneller alsputs
.Hinweis: Gemäß Kommentaren ist '\ 0' eine Ganzzahlkonstante. Der richtige Ausdruck sollte
sizeof(char)
den Kommentaren entsprechen.quelle
'\0'
hat Typint
, also wird dies auf den meisten Systemen gedrucktUsing fwrit
. Wenn Sie 1 Byte weniger drucken möchten, verwendensizeof (char)
Sie einfach 1.put () schreibt den String s und eine nachfolgende Newline in stdout.
Die Funktion printf () schreibt die Ausgabe unter der Kontrolle einer Formatzeichenfolge, die angibt, wie nachfolgende Argumente für die Ausgabe konvertiert werden, in stdout.
Ich werde diese Gelegenheit nutzen, um Sie zu bitten, die Dokumentation zu lesen.
quelle
Mit der Funktion printf () werden sowohl Zeichenfolgen als auch Variablen auf dem Bildschirm gedruckt, während mit der Funktion put () nur Zeichenfolgen auf Ihrem Bildschirm gedruckt werden können.
quelle
puts
ist die einfache Wahl und fügt am Ende eine neue Zeile hinzu undprintf
schreibt die Ausgabe aus einer formatierten Zeichenfolge.Siehe die Dokumentation für
puts
und fürprintf
.Ich würde empfehlen, nur zu verwenden,
printf
da dies konsistenter ist als die Umschaltmethode. Wenn Sie also ein Debugging durchführen, ist es weniger schmerzhaft, alle printfs alsputs
und zu durchsuchenprintf
. Meistens möchten Sie eine Variable auch in Ihren Ausdrucken ausgeben, daherputs
wird sie meistens im Beispielcode verwendet.quelle
Beim Vergleichen
puts()
undprintf()
, obwohl ihr Speicherverbrauch fast gleich ist,puts()
dauert mehr Zeit im Vergleich zuprintf()
.quelle