4 Stimmen

wird 'printf' immer seine Aufgabe erfüllen?

printf("/*something else*/"); /*note that:without using \n in printf*/

Ich weiß, dass printf() einen Puffer verwendet, der ausgibt, was er enthält, wenn im Zeilenpuffer " \n " wird von der Pufferfunktion gesehen. Wenn wir also vergessen, " \n "in printf(), wird der Zeilenpuffer selten nicht geleert. Daher wird printf() seine Aufgabe nicht erfüllen. Liege ich falsch?

2voto

fbrereto Punkte 34770

Das oben angeführte Beispiel ist sicher, da es keine variablen Argumente für printf . Es ist jedoch möglich, einen Formatstring anzugeben und Variablen zu liefern, die nicht mit dem Format übereinstimmen, was zu unerwarteten (und unsicheren) Ergebnissen führen kann. Einige Compiler verfolgen einen proaktiveren Ansatz mit printf Anwendungsfallanalyse, aber selbst dann sollte man sehr, sehr vorsichtig sein, wenn printf verwendet wird.

2voto

WhirlWind Punkte 13556

Aus meiner man-Seite:

Diese Funktionen geben die Anzahl der gedruckten Zeichen zurück (ohne die die nachgestellten \0 verwendet, um die Ausgabe in Strings zu beenden) oder ein negativer Wert wenn ein Ausgabefehler auftritt, außer bei snprintf() y vsnprintf() , die die Anzahl der Zeichen zurückgeben, die gedruckt worden wären, wenn das n unbegrenzt wäre (wiederum ohne das abschließende \0 ).

Es klingt also so, als würde die Dose mit einem negativen Fehler fehlschlagen.

1voto

Greg Hewgill Punkte 882617

Ja, Ausgabe an stdout in C (unter Verwendung von printf ) ist normalerweise zeilengepuffert. Dies bedeutet, dass printf() sammelt die Ausgabe, bis entweder:

  • der Puffer voll ist, oder
  • enthält die Ausgabe eine \n Zeilenumbruch

Wenn Sie die Ausgabe des Puffers erzwingen wollen, rufen Sie fflush(stdout) . Dies funktioniert auch, wenn Sie etwas ohne Zeilenumbruch gedruckt haben.

1voto

jim mcnamara Punkte 15439

Auch printf und Co. können fehlschlagen.

Übliche Implementierungen von C rufen malloc() in der printf-Familie der stdC-Bibliothek auf.
malloc scheitern kann, dann wird auch printf scheitern. Unter UNIX kann der write()-Aufruf durch EINTR unterbrochen werden, so dass eine Kontextumschaltung unter UNIX zu Fehlern führt (EINTR). Windows kann und wird ähnliche Dinge tun.

Und... Auch wenn es hier nicht oft gepostet wird, sollten Sie immer den Rückgabewert jeder System- oder Bibliotheksfunktion überprüfen, die einen Wert zurückgibt.

0voto

cHao Punkte 81921

Nein, so nicht. Es wird nicht immer so funktionieren, wie Sie es erwarten, besonders wenn Sie Benutzereingaben als Formatzeichenfolge verwenden. Wenn das erste Argument %s oder %d oder andere Formatspezifikationen enthält, werden sie geparst und durch Werte vom Stack ersetzt, was leicht zu einem Fehler führen kann, wenn ein Zeiger erwartet wird und stattdessen ein int erhalten wird.

Dieser Weg ist in der Regel viel sicherer:

printf("%s", "....");

Der Ausgabepuffer wird vor dem Beenden oder vor der Eingabe geleert, so dass die Daten unabhängig davon ankommen, ob Sie eine \n.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X