[C] printf oder puts?

Paldium

Well-Known Member
Hallo,

des öfteren fällt mir auf, dass

Code:
printf("text\n");
in
Code:
puts("text");

umgeschrieben wird, was mir persönlich auch sinnig erscheint, da beides (im Betrachter des Anwenders) das gleiche ausführt. Nun kommt es aber oft vor, dass dieses printf nicht ersetzt wird, bzw. es Fälle gibt, in denen sowohl puts als auch printf in der gleichen Funktion genutzt werden (wobei keine weiteren Änderungen an der Ein-/Ausgabe stattfand).

Daher meine Frage:

Welchen Unterschied macht es, ob ich puts() oder printf() verwende? Selbstverständlich ist mir klar, dass printf weit aus mehr kann als nur einen String zurückgeben. Es geht mir daher gerade wirklich nur um diesen speziellen Fall.

Danke im Voraus!
 
Zuletzt bearbeitet:
Wer schreibt das um? Und was genau ist eigentlich die Frage? Also puts(3) duerfte marginal schneller sein als printf(3), aber das ist mal der falsche Ort um Code zu optimieren.
 
Also:

die Frage war, ob es einen Unterschied macht, ob ich printf oder puts aufrufe, um einen String auszugeben. Mit Unterschied meine ich die unterschiedlichen Aufrufe, die innerhalb von printf() und puts() stattfinden.

Wenn ich ein gewöhnliches Hallo-Welt-Programme schreibe, dann macht der gcc sowieso aus printf("Hallo Welt!\n"); ein puts("Hallo Welt!"); - das war mir bereits bewusst.

Ich war mir nur nicht sicher, ob printf() irgendeine Art Vorteil bei der Verarbeitung des Terminals (zum Beispiel Buffer, etc.) aufbringt, so dass dies der Grund sein könnte, printf() zu verwenden.

Ein gutes Beispiel, dass Funktionsaufrufe geändert werden, wäre das hier:

FreeBSDs sleep

Mal wird in usage write, dann wieder fprintf genutzt. Wäre da auch problemlos fputs möglich? Außerdem wurde im CVS-Log geschrieben, dass write() weniger Speicher wegnimmt, nun gut - aber dann wird die Änderung wieder zurückgenommen ... ich weiß in solchen Fällen einfach nicht, was ich davon halten soll.

Oder:

OpenBSDs bind

In Funktion dodecl():
Code:
fputs("\n", stdout);
Hm, hätte es da ein einfaches puts(""); genauso gut getan?


Dass der Schreibstil sich ändert, sieht man schon bei "return 0" vs. "return(0)" vs. "return (0)". Wenn das alles einfach nur eine Schreibsache ist, dann beantwortet das schon meine Frage. :)
 
Paldium schrieb:
Ich war mir nur nicht sicher, ob printf() irgendeine Art Vorteil bei der Verarbeitung des Terminals (zum Beispiel Buffer, etc.) aufbringt, so dass dies der Grund sein könnte, printf() zu verwenden.

Nein, hier sollten sich beide gleich Verhalten. Ich habe mal nachgesehen, puts(3) unter FreeBSD ruft effektiv nur __sfvwrite() auf, wohingegen printf(3) nach 800 Zeilen Code endlich mal ein __sprint() abliefert. Wo zwischen den beiden nun der Unterschied ist, kann ich dir aber jetzt auch nicht sagen.

Code:
fputs("\n", stdout);
Hm, hätte es da ein einfaches puts(""); genauso gut getan?
Im Endeffekt ja, aber ich sehe gerade, dass puts(3) zwei IO-Vectors benoetigt und fputs(3) mit einem auskommt! ZOMG!

Naja, ich denke mal es ist groesstenteil Geschmack. Es gibt schliesslich so viele Wege eine Zeile auszugeben ...

Dass der Schreibstil sich ändert, sieht man schon bei "return 0" vs. "return(0)" vs. "return (0)". Wenn das alles einfach nur eine Schreibsache ist, dann beantwortet das schon meine Frage. :)
Das ist aber eine leicht andere Situation. IIRC war return frueher ein Funktionsaufruf und deshalb musste das Argument natuerlich geklammert werden. Neuere C-Standards haben es dann als keyword reserviert und die Funktion wurde dem Compiler uebertragen.
 
Zurück
Oben