myGully.com

myGully.com (https://mygully.com/index.php)
-   Programmierung (https://mygully.com/forumdisplay.php?f=67)
-   -   [C] Formatierte Ein-/Ausgabe mit >>scanf()<< und >>printf()<< --- Frage (https://mygully.com/showthread.php?t=2320613)

Nudelsalat96 26.05.11 17:41

[C] Formatierte Ein-/Ausgabe mit >>scanf()<< und >>printf()<< --- Frage
 
Hi, ich bin grade dabei C zu lernen und da bin ich auf ein paar Fragen gestoßen, als ich scanf() behandelt habe. Es geht um das zweite printf(). (printf("Die Zahl war: %d\n",i); )



Meine Fragen:
1. Wieso muss ich nach dem Zeichen für die Dezimalzahl ein \n machen? (Es bedeutet Newline, das weiß ich, aber für was braucht man es da?)
2. Wieso muss ich die Anführungszeichen hinter %d\n machen? (Und nicht hinter dem ,i?)
3. Wieso steht jetzt bei dem i kein Adressoperator? (&)

Bitte nicht genervt reagieren, denn ich habe kein Plan davon, da ich gerade damit angefangen habe. ;)

thx.

waldfee0071 26.05.11 18:12

1. musst du nicht ^^
2. das in den anführungszeichen ist das was ausgegeben wird, dahinter kommen variablen, falls welche ausgegeben werden sollen
3. beim einlesen wird das & benötigt, beim ausgeben nicht

Nudelsalat96 26.05.11 18:38

1. Hab ich jetzt verstanden, danke.
2. Hab ich jetzt so halbwegs verstanden. Woher weiß der Computer dann wo (also, wenn man das was ausgegeben wird in Anführungszeichen schreibt, dann weiß der Computer doch gar nicht wo er die Variable im Text/Ausgabe ausgeben soll) er die Variable (besser gesagt den Wert der Variable) ausgeben soll?
3. Hab ich jetzt auch verstanden, danke.

Your_Conscience 26.05.11 18:54

Ich versuche dir mal den 2. Punkt genauer zu erläutern:

Also gucken wir uns mal diese Zeile an: "printf("Die Zahl war: %d\n",i);"
Das printf sagt dem Compiler erstmal, dass jetzt eine formatierte Ausgabe folgt.
Danach kommt dieser Abschnitt: "Die Zahl war: %d\n"
Da dies in Anführungszeichen steht, zeigt es dem Compiler, dass das ein Text ist, der ausgegeben wird. Allerdings überprüft er noch, was dort so steht: Wenn er zb. "%d" findet, sagt es ihm, dass an dieser stelle eine ganze (integer) Zahl steht. Das "\n" steht für eine neue Zeile, das hast du richtig erkannt.
Bei der Ausgabe ersetzt er dann das "%d" durch das i. Warum? Weil es hinter dem Komma steht.

Bsp.:
printf("A%d, B%d, C%d", x, y, z);
Wenn x = 1, y = 2, z = 3 würde er "A1, B2, B3" ausgeben.
Also in das erste %d wird die erste Variable nach dem Komma eingesetzt, beim 2. %d die 2. Variable und beim 3. %d die 3. Variable.
Es muss auch nicht unbedingt %d sein: Bei zb. "printf("A%d, B%e, C%f", x, y, z);" wird das %d wieder durch das x, %e durch y und %f durch z ersetzt.
%e und %f stehen dann für Gleitkomma-Zahlen.

Ich hoffe, dass das jetzt verständlich genug war - hab mir Mühe gegeben :)

Nudelsalat96 26.05.11 19:20

Danke dir, jetzt hab ich das auch verstanden, ich wusste nämlich immer nicht, wie der Compiler die Zahl einsetzt. Jetzt macht das auch Sinn.
PS: %d hab ich genommen, da dies ja die Dezimalzahl ist, und ich mir noch keine Gedanken über Gleitkommazahlen gemacht habe :D.

DankeDankeDanke ;)

Timmee1616 26.05.11 20:29

[Link nur für registrierte und freigeschaltete Mitglieder sichtbar. Jetzt registrieren...]
hier mal was zum nachschlagen - da find ich ist eig. alles für den Anfang recht gut erklärt - ich hab das auch als Buch!

Nudelsalat96 26.05.11 20:54

Ich hab das ja auch. Und dabei ist mir die Frage gekommen. Da steht nämlich nicht erklärt weswegen das newline Zeichen da steht usw... Trotzdem Danke.

Timmee1616 26.05.11 21:08

Naja Newlinezeichen muss ja auch nicht sein
is nur weil sonst das "drücken sie eine Taste..." direkt nach "Schaltjahr" oder "kein Schaltjahr" steht
Das ist nur wegen der Optik

Timmee1616 26.05.11 21:09

Sorry hab den Thread verwechselt...
Habs jetz rauseditiert...

germgerm 27.05.11 07:48

Online schaue ich auch gerne da nach:

[Link nur für registrierte und freigeschaltete Mitglieder sichtbar. Jetzt registrieren...]

Timmee1616 27.05.11 12:04

So \n Sachen und so sind eig. immer nur wegen der Optik!

testerws 29.05.11 20:46

Zitat:

Zitat von Nudelsalat96 (Beitrag 22319191)
3. Wieso steht jetzt bei dem i kein Adressoperator? (&)

thx.

Weiss nicht ob das schon erklärt worden ist, aber bevor du z.B. solch eine Frage stellst, kannst ja ausprobieren was passiert wenn du jetzt in diesem Fall den Adressoperator hinzufügst. Du solltest die Adresse dann "rausgespuckt" bekommen, willst aber den Wert welcher bei dieser Adresse gespeichert ist, deshalb kein & :)

Nudelsalat96 30.05.11 18:37

Okay, ich versuchs vorher jetzt immer, aber ich wollte ja wissen wozu das gut ist. ;)

Timmee1616 30.05.11 19:50

Ja steht doch jetz da wozu das gut ist...
Mit & bekommst die Adresse
ohne & den Werd der da steht

germgerm 31.05.11 07:27

Zitat:

Zitat von Nudelsalat96 (Beitrag 22334478)
Okay, ich versuchs vorher jetzt immer, aber ich wollte ja wissen wozu das gut ist. ;)

scanf erwartet einen pointer auf einen wert, ist normalerweise im h-file ersichtlich. in diesem speziellen fall nicht, da eine nicht definierte anzahl von werten angegeben werden können.
in c werden werte immer "by value" übergeben. damit ein funktionsergebnis in der parameterliste zurückübergeben werden kann, ist also ein pointer nötig. damit wird quasi eine übergabe "by reference" erzwungen.

zusammenfassung bzw lügen für kinder: wenn eine fkt eine übergebene variable ändern muss, kommt ein & davor.

Timmee1616 31.05.11 19:41

Unser Lehrer hat immer gemeint mit & übergibt man das Original und ohne & nur die Kopie...
Wenn das fürs Verständnis was hilft...

Etikareti 08.06.11 22:07

Das sind Zeiger/Referenzen ^^ (eines der Schwierigeren Themen in C++)
z.B.
Zitat:

int X=30;
int *pX = NULL;
int &rX = X;
pX = &X;


cout<<"Zeiger: pX="<<*pX<<endl;
cout<<"Referenz: rX="<<rX;
Zeiger, erklärt sich eig. von alleine ^^, Zeigt auf die Adresse einer Variable (oder Structur oder sonst was...)
Referenz, Spiegelbild von z.B. einer Variable. Keine Lust das etz ausfürhlich zu erklären xd...


Edit: Die Seite Galileo Computing C von A bis Z, [Link nur für registrierte und freigeschaltete Mitglieder sichtbar. Jetzt registrieren...] , ist echt nice, aber ich versteh nicht warum dort alles mit printf ausgegeben wird oO, mit std::cout/cout is das doch viel angenehmer zu lesen, vorallem für Anfänger...Naja, jedem das seine ^^

Timmee1616 09.06.11 01:12

Das ist deshalb alles mit printf,... weil cin, cout nicht C sondern C++ ist!


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:26 Uhr.

Powered by vBulletin® (Deutsch)
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.