Hallo, On Mon, 19 May 2003, Daniel Feist wrote:
Ich meinte eigendlich, warum vor a=%d das 'a' angegeben werden muss und warum am Schluss dann nochmal 'a' angegeben wird! Mir kam das komisch vor mit den 2 'a's. Man könnte ja auch das erste a weglassen.
Du hast printf nicht verstanden, wobei das Beispiel auch etwas ungluecklich diesbezueglich ist. Was haben wir aber eigentlich? printf("der Wert von int a=%d, b=%d, c=%c"\n, a,b,c); Zuerstmal ist da ein Fehler, das '\n' gehoert mit in den Formatstring, dem ersten Argument von printf: printf("der Wert von int a=%d, b=%d, c=%c\n", a,b,c); (achte darauf, wo das zweite " den String beendet!) So. Wir haben also printf mit 4 Argumenten: printf( "der Wert von int a=%d, b=%d, c=%c\n", a, b, c ); Der komplette String ist _ein_ Argument, das allerdings eben 3 Platzhalter fuer Variablen enthalten muss (siehe man printf). Man koennte also schreiben: printf( "%d%d%c", a, b, c ); Oder, etwas ausfuehrlicher (Achte wieder auf die "", der String ist nun sehr lang!) printf( "Der in der Variablen 'a' enthaltene Wert ist: %d\n der in der Variablen 'b' enthaltene Wert ist: %d\n der in der Variablen 'c' enthaltene Wert ist: %c\n", a, b, c ); Was macht nun printf? Nunja, eigentlich ganz simpel. Es verlangt erstmal einen 'const char*' als erstes Argument. In diesem Argument sucht es dann nach Platzhaltern wie %d, %f, %i usw. Jedesmal, wenn ein Platzhalter gefunden wird, wird an dieser Stelle versucht, das jew. naechste Argument (das 2te, 3te usw.) gemaess der Formatierungsangabe des Platzhalters einzusetzen. Im Beispiel also (ich spiel mal printf): Ok, ich bekomm ein 'const char*' als erstes Argument, soweit so gut. Geben wir erstmal alles bis zum ersten Platzhalter aus: »Der in der Variablen 'a' enthaltene Wert ist: « Huch! Jetzt hab ich nen Platzhalter! Aha. Ok, ich soll also das naechste Argument, also Nr. 2, als "signed decimal" ausgeben. Machen wir. Ok, das naechste Arguement ist die Variable a, schauen wir also, was drin steht, ah, ne 4, also geben wir das mal aus: »4« So, das war der erste Platzhalter... Was als naechstes? Ok, der String geht weiter: »\n der in der Variablen 'b' enthaltene Wert ist: « Nun wieder ein Platzhalter (%d): »3« .... usw... Du musst also unterscheiden zwischen dem erstem Argument (einem 'const char*'), dem "Formatstring", das durch ein '\0' abgeschlossen sein muss und ggfs. Platzhalter enthalten kann. Die Platzhalter werden durch ein '%' gekennzeichnet, ein auszugebendes '%' muss als '%%' im 'const char*' stehen. Kommen Platzhalter vor, so muss fuer jeden Platzhalter ein weiteres Argument angeben werden, dass dann gemaess der Vorgabe des Platzhalters ausgegeben wird. Achso, statt "Platzhalter" wird i.d.R. der Begriff "Formatangaben" o.ae. verwendet... Ach noch was: Das Beispiel ist noch weiter defekt, die Variable 'c' ist als 'int' deklariert, soll aber als 'char' (Platzhalter %c) ausgegeben werden... Aehm, also, wenn sowas kaputtes in deinem Lehrtext als Beispiel vorkommt, dann kannst du wohl davon ausgehen, dass der Lehrtext, aehm, vornehm formuliert, "schlecht" ist... -dnh -- "That time in Seattle... was a nightmare. I came out of it dead broke, without a house, without anything except a girlfriend and a knowledge of UNIX." "Well, that's something," Avi says. "Normally those two are mutually exclusive." --Neal Stephenson, "Cryptonomicon"