PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : C: Konkatenieren eines % Zeichens



Stefan Feeser
19-07-2006, 14:01
Hallo zusammen,

ich mache gerade einen C/C++ Kurs und muss in einer Aufgabe ein %-Zeichen ausgeben. Ich habe es mit:


printf("\%\n");

versucht, erhalte aber nur komische Zahlen an der Stelle auf den Bildschirm. Im Web habe ich auch schon gesucht, konnte aber nichts finden das mir weitergeholfen hat.

Wäre nett wenn mir jemand das mit dem Konkatenieren (verstehe ich bislang als Ausgabe von einer Programmiersprache benutzten internen Zeichen) erklären könnte.

Gruss und Danke

Stefan

Stefan Feeser
19-07-2006, 14:14
Hi,

unter Mithilfe eines Arbeitskollegen habe ich die Lösung selbst gefunden. Man muss einfach


printf("%%\n");

sagen. Steht wohl auch in der Manpage, die ich mir doch glatt nicht angesehen habe;).

Falls aber doch jemand genau erklären kann, warum man im diesen Fall %% schreiben muss, wäre das klasse.

Gruss

Stefan

nul
19-07-2006, 15:28
Ich schaetze mal dass das mit der Verarbeitung der argumente zu tun hat die printf bekommt. Es wird im char*-String nach % gesucht und nicht ueberprueft ob vor % ein \ steht.
Daher wird man dann wohl den Sonderfall mit %% eingefuehrt haben. Ist aber nur so ne Idee von mir, muss ueberhaupt nicht stimmen.

locus vivendi
19-07-2006, 15:45
Hallo zusammen,

ich mache gerade einen C/C++ Kurs[...]
Pass aber auf, denn nicht alles was in C eine vernünftige Lösung eines Problems ist, ist auch vernünftig wenn man es 1:1 auf C++ überträgt. Dein Kurs sollte darauf eingehen.


Falls aber doch jemand genau erklären kann, warum man im diesen Fall %% schreiben muss, wäre das klasse.
Also meiner bescheidenen Meinung nach hätte euch das im Kurs bereits an dieser Stelle beigebracht werden müssen. So stochern die Kursteilnehmer planlos im Nebel rum, um es mal so blumig auszudrücken. Das übt aber nicht gut.

Wie auch immer: % ist ein Sonderzeichen im Format-String (so wird das Gebilde das du printf als erstes Argument übergibst genannt) welches der Funktion signalisiert "Halt, jetzt kommt etwas was gesondert zu behandeln ist!". Wenn die Funktion auf dieses Zeichen trifft, dann erwartet sie, dass *danach* besondere Angaben kommen.

Um noch ganz Spitzfindig zu sein: Es ist keineswegs so, das du %% schreiben *musst*, um ein % auszugeben. Du kannst das auch auf andere Arten erledigen. Womit du übrigens einen Vorschlag für eine Übungs-"aufgabe" hättest: Wenn du auf mindestens drei Arten ein % mit printf ausgeben kannst, dann hast du bestimmt die Hälfte von dem drauf was man über printf wissen muss.

Stefan Feeser
19-07-2006, 16:32
Hi,

vielleicht habe ich im Kurs ja an manchen Stellen nicht richtig aufgepasst... Mir war eigentlich klar, dachte ich wenigstens, dass mit % eine Formatierung eingeleitet wird. Hierzu gibt es verschiedene 'Formate', je nach Datentyp der ausgegeben werden soll. \ hingegen leitet doch normalerweise eine Escapesequenz ein, also z. B. einen Wagenrücklauf oder ein Beep. Ich war nun der Meinung das man sogenannte interne Bezeichner, also die Zeichen, welche innerhalb von C mit Sonderaufgaben belegt sind durch das sogenannte Konkatenieren (diesen Begriff habe ich irgenwann mal im Internet gefunden und ich bin der Meinung, dass dieser eben das eben beschriebene darstellt - wenn ich hier falsch liege, verbessere mich ruhig) darstellen kann.

Ich habe eben mal ausprobiert das Prozentzeichen in einfache Anführungszeichen, bzw. Hochkomma, zu packen, aber das funzt nicht. Kannst Du vielleicht doch ein wenig deutlicher werden, da ich offenbar printf doch noch nicht vollständig verstanden habe.

Ich arbeite aber dran und lese auch noch ein wenig in dem Buch Systemprogrammierung von Herold.

Gruß und schon mal Vielen Dank für die Infos

Stefan

locus vivendi
19-07-2006, 19:01
Mir war eigentlich klar, dachte ich wenigstens, dass mit % eine Formatierung eingeleitet wird. Hierzu gibt es verschiedene 'Formate', je nach Datentyp der ausgegeben werden soll. \ hingegen leitet doch normalerweise eine Escapesequenz ein, also z. B. einen Wagenrücklauf oder ein Beep.
Das ist alles richtig. Man muss aber aufpassen das man es auseinanderhält. Das "escapen" mit \ geschieht durch den Präprozessor zur Zeit des Compilierens. Die Auswertung des Formatstrings geschieht vom Konzept her erst zur Laufzeit des Programms, d.h. wenn sämtliche Präprozessor-Escapesequenzen bereits aufgelöst wurden.


Ich habe eben mal ausprobiert das Prozentzeichen in einfache Anführungszeichen, bzw. Hochkomma, zu packen, aber das funzt nicht. Kannst Du vielleicht doch ein wenig deutlicher werden, da ich offenbar printf doch noch nicht vollständig verstanden habe.
Das sind ebenfalls Dinge die bereits beim compilieren ausgewertet werden. Ich dachte eigentlich daran, dass man printf ja angeben kann, dass weitere Funktionsargumente folgen, die dann formatiert ausgegeben werden. Mit einem Buch dazu und suchen nach "printf", "printf examples", "printf beispiele" und ähnlichem sollte eigentlich schnell Licht in die Sache kommen. Und sonst wirst du das bestimmt auch noch in deinem Kurs hören...

Stefan Feeser
19-07-2006, 19:53
Hi,

danke für die Hinweise!!!

Noch nen schönen Abend

Stefan

panzi
20-07-2006, 01:11
Die 3 Arten der % Ausgabe:

printf("%%");
printf("%s", "%");
printf("%c", '%');
Noch 2 weitere Möglichkeiten:

putchar('%');
puts("%");
Und dann gibts noch:

fwrite("%",1,1,stdout);
write(1,"%",1);
Und in C++:


cout << '%';
cout.put('%');
cout.write("%",1);

Stefan Feeser
22-07-2006, 09:25
Hallo und vielen Dank für den Hinweis!!!

Auf den formatierten String oder den Character wäre ich nicht gekommen, wenngleich ich die Formatierungszeichen kenne.

Gruss

Stefan

Joghurt
24-07-2006, 19:56
Die coolste Lösung habt ihr aber noch nicht gepostet:

printf("%c",'H'+'a'-'l'+'l'-'o'-' '+'W'-'e'+'l'-'t'+'!');:D

(Hätte nicht gedacht, dass das so gut klappt!)

panzi
25-07-2006, 17:45
Die coolste Lösung habt ihr aber noch nicht gepostet:

printf("%c",'H'+'a'-'l'+'l'-'o'-' '+'W'-'e'+'l'-'t'+'!');:D

(Hätte nicht gedacht, dass das so gut klappt!)
Geeky! ruled.