Wenn Sie können! Die Chancen sind hoch – beziehungsweise absolut sicher –, dass Sie einen der folgenden Fehler erhalten, wenn Sie kompilieren wollen:
fehlende ')' vor Bezeichner 'Ta'
oder
Funktionsaufruf ohne )
oder
Syntaxfehler vor "Ta"
oder
expected ')' before 'Ta'
Der genaue Wortlaut unterscheidet sich von Compiler zu Compiler, aber die Fehlermeldung wird sinngemäß erscheinen.
Das Problem ist, dass printf
einen in Anführungszeichen eingeschlossenen Text benötigt. Der Compiler weiß das. Nach dem zweiten Anführungszeichen, vor dem Wort Ta
, erwartet der Compiler etwas anderes, höchstwahrscheinlich die zweite Klammer )
oder eine andere gültige C-Anweisung. Aber davon ist hier nichts zu sehen, also erzeugt er den Fehler. Glück gehabt.
Offensichtlich gibt es keinen Grund, warum doppelte Anführungszeichen in einem String auftauchen können, sodass der Compiler ins Stolpern gerät. Die Lösung besteht in der Verwendung einer Escape-Sequenz .
Ein String darf keine doppelten Anführungszeichen oder einige der anderen im nächsten Abschnitt aufgelisteten Zeichen enthalten. Er muss mit einem Anführungszeichen beginnen und mit einem Anführungszeichen enden. Aber mittendrin? Keine Chance.
Um solche besonderen Zeichen auszugeben, müssen Sie Escape-Sequenzen verwenden; dies ist ein spezieller Weg, um andersartige Zeichen in einem String unterzubringen, ohne das printf
zu stören.
Wenn Sie mit einer integrierten Entwicklungsumgebung arbeiten, haben Sie den Fehler eventuell bereits bei der Eingabe bemerken können, weil die Textfärbung des Strings nicht mehr korrekt war. Dies ist einer der Vorteile einer integrierten Entwicklungsumgebung. Unser Code::Blocks tut das leider erst nach dem Aufruf des Compilers, noch nicht während der Eingabe.
In den alten Tagen wäre ein Programmierer auch ohne diese Zeichen ausgekommen. Statt den mehrfachen doppelten Anführungszeichen hätte er einfach zwei Apostrophe verwendet. Einige altehrwürdige Programmierer, die sich mit Escape-Sequenzen nicht auskennen, nutzen solche Tricks immer noch.
Escape-Sequenzen verwendet man, um einige unzulässige Zeichen in Strings einzubauen. Dazu benutzt man den Backslash \
. Sie erreichen das Zeichen mit
+ß. Der Backslash ist immer das erste Zeichen in einer Escape-Sequenz. Wenn printf
auf einen Backslash stößt, denkt es: »Du liebe Zeit, gleich kommt eine Escape-Sequenz!«, und macht sich bereit, ein sonst verbotenes Zeichen aufzunehmen.
Schauen wir uns also nun das neue und verbesserte Programm an:
#include
int main()
{
printf("Er sagte: \"Ta da! Ich bin ein String.\"");
return 0;
}
Listing 3.3:Name: Dblquote2.c
Die einzige Änderung passiert in Zeile 5. Beachten Sie die Escape-Sequenz \"
in dem String. Sie taucht zweimal auf, einmal in der Mitte und einmal am Ende. Die äußeren Anführungszeichen bleiben unverändert. Sieht verrückt aus, funktioniert aber.
Speichern Sie das Programm Dblquote2.c
, kompilieren und starten Sie es. Diesmal sollte es funktionieren und den folgenden Text ausgeben:
Er sagte: "Ta da! Ich bin ein String."
Die Escape-Sequenz \" erzeugt in einem String das Anführungszeichen.
Eine andere nützliche Escape-Sequenz kennen Sie von Kapitel 2: \n. Sie erzeugt eine neue Zeile in einem String, so als wenn Sie drücken würden.
Alle Escape-Sequenzen beginnen mit einem Backslash \. Wie stellt man also den Backslash selbst in einem String dar? Man nimmt zwei: \\ ist die Escape-Sequenz, die einen – Achtung! – nur einen \ in einem String einfügt.
Eine Escape-Sequenz kann überall in einem String auftauchen: am Anfang, in der Mitte, am Ende. Wo es gerade benötigt wird.
Weitere Escape-Sequenzen werden in Tabelle 3.1 weiter hinten in diesem Kapitel aufgelistet.
Das f steht für formatiert
Die Funktion heißt aus einem bestimmten Grund printf
. Das f
bedeutet etwas, es steht nicht etwa für Funktion, sondern es steht für formatiert . Der Vorteil von printf
im Vergleich zu anderen Ausgabefunktionen in C liegt darin, dass die Ausgabe formatiert sein kann.
Spätere Kapitel führen Sie noch in die Formatierungsaspekte von printf
ein, im Moment kein Grund zur Sorge, aber ich muss Ihnen das nun zeigen. Denn wenn printf
für Formatierungen benutzt wird, bekommt es ein anderes Aussehen.
Weitere Informationen darüber, was Variablen sind und was sie tun, erhalten Sie in Kapitel 4.
Ja, die printf
-Funktion stellt immer noch Ausgaben auf dem Bildschirm dar. Aber der dargestellte String kann auch ein Formatstring sein, also einer, der das Format der Ausgabe steuern kann:
printf("FormatString"[, var[, …]]);
Was in den Anführungszeichen erscheint, ist in Wirklichkeit ein Formatstring . Es ist immer noch ein Text, der bei der Ausgabe geschrieben wird. Im String eingemischt sind verschiedene Konvertierungszeichen , spezielle »Platzhalter«, die printf
sagen, wie es seine Ausgaben formatieren muss.
Die zusätzlichen Dinge, die in der obigen Codezeile in den eckigen Klammern stehen, heißen Argumente . Das Argument heißt var , kurz für Var iable. printf
kann benutzt werden, um den Inhalt einer oder mehrerer Variablen darzustellen. Dies macht man, indem man bestimmte Konvertierungszeichen im FormatString
benutzt. Die Abbildung verdeutlicht dies sehr schön.
Das [, …]
bedeutet, dass man eine beliebige Anzahl von Variablen in einer einzigen printf
-Funktion anfügen kann (aber vor der schließenden Klammer). Auf jeden Fall muss für jede Variable in FormatString
ein zugehöriges Konvertierungszeichen stehen. Diese müssen zueinander passen, oder Sie erhalten einen Fehler bei der Kompilierung oder später im lauffähigen Programm.
Zum jetzigen Zeitpunkt besteht keine Notwendigkeit, tiefer in die kalten und dunklen Gewässer der printf
-Funktion einzusteigen – Argumente und Variablen.
Allerdings, vielleicht ist es auch an der Zeit für ein Programm, das die Möglichkeiten der printf
-Formatierungen zeigt. Dieses Programm ist Justify.c
, dessen Inhalt unwichtig ist, aber dessen Ausgabe Sie ungläubig bestaunen dürfen. Justify.c
stellt zwei Strings dar: rechts
wird rechtsbündig ausgerichtet, links
wird linksbündig ausgerichtet. Das wird mehr Sinn machen, wenn Sie sich die Ausgabe des Programms ansehen.
#include
int main()
{
printf("%15s", "rechts\n");
printf("%-15s", "links\n");
return 0;
}
Listing 3.4:Name: Justify.c
Читать дальше