Seite 1 von 1
[tut.at] Tutorialfrage 4.2
Verfasst: Mo Jul 30, 2012 9:24 am
von Niko
1.jpg
Hallo
Ich hoffe Ich stelle die Frage an der richtigen Stelle und dass mein Problem nicht so lächerlich ist.
Also ich habe vor kurzem mit dem Tutorial zu C begonnen und stecke jetzt bei den arithmetischen Operatoren fest.
Dies ist der Quellcode den ich erstellt habe:
Code: Alles auswählen
#include <stdio.h>
int main()
{
int faktor1, faktor2;
printf ("Faktoren eingeben: ");
scanf ("%d %d", &faktor1, &faktor2);
printf ("%d * %d = %d\n", faktor1, faktor2, faktor1 * faktor2);
return 0;
}
Wenn ich dann in der Konsole jedoch z.B. 2*4 eingebe erscheint beim zweiten Faktor eine völlig andere Zahl.
Ich hoffe ihr könnt mir helfen
Lg Niko
Edit by cloidnerux: code tags
Edit by Xin: Doppelte Grafik raus, tut.at in Titel hinzugefügt.
Re: Tutorialfrage 4.2
Verfasst: Mo Jul 30, 2012 9:39 am
von cloidnerux
Willkommen im Forum.
Dein Problem ist nicht so dämlich, aber ich kann dir sagen, dass dein Programm funktioniert.
Das Problem ist, dass scanf in deinem Fall NUR 2 Zahlen erwartet und damit den kompletten Input als Zahlen interpretiert. Damit ist der Ausdruck 2*4 für dein Programm die Zahlen "2" und "*4". Und das "*" ist für den Computer auch nur eine Zahl, die als Text dann eben das Sternchen darstellen soll. Damit ergibt sich, dass du nicht 4 sondern eine unbrauchbare Eingabe erhälst.
Versuch es stattdessen mal mit "2 4", also einem Leerzeichen statt einem Stern.
Re: Tutorialfrage 4.2
Verfasst: Mo Jul 30, 2012 9:44 am
von Niko
Vielen Dank so hat es funktioniert
Aber wieso erkennt er + und - nicht als Zahl an, sonder nur * ?
Re: Tutorialfrage 4.2
Verfasst: Mo Jul 30, 2012 11:25 am
von fat-lobyte
Wie meinst du das?
scanf() ist eine der schlimmsten C-Funktionen, die es gibt, und schon gar keine, die Anfänger benutzen sollten.
Dein scanf()-Aufruf tut folgendes: es werden zwei Zahlen erwartet, getrennt durch "whitespace" (also Leerzeichen). Entspricht das eingegebene Format nicht dem was es erwartet, werden die Zeichen ignoriert und stehengelassen. Dabei werden die darauffolgenden Zahlen gar nicht erst eingelesen! Und das ist, was hier passiert: was hat dein '*'-Zeichen dort zu suchen? In deinem Format-String für scanf() steht nur "%d %d", also da ist nur ein Leerzeichen dazwischen! Kein '*', kein '+' und kein '-'.
lies dir mal folgenden Artikel durch:
http://www.proggen.org/doku.php?id=c:faq:input-puffer
Re: Tutorialfrage 4.2
Verfasst: Mo Jul 30, 2012 11:28 am
von Xin
Niko hat geschrieben:Vielen Dank so hat es funktioniert
Aber wieso erkennt er + und - nicht als Zahl an, sonder nur * ?
+4 ist eine gültige Zahl. -2 auch.
*2 ist ... merkwürdig.
Er hat bei 2*4 für das erste %d die 2 geparst. Super, bleiben "*4" als noch nicht gelesen über. Dann soll ein Leerzeichen kommen (kommt bei "*4" aber nicht). Jetzt geht die Raterei los, denn die Eingabe entspricht nicht der Erwartung. Das zweite %d wird also nicht mehr wirklich initialisiert... womit das Ergebnis Deiner Aufgabe gewürfelt wird.
scanf sollte man nicht benutzen, weil man sehr leicht falsche Eingaben machen kann - wie dieser Thread beweist

- und dann falsche Ergebnisse erhält.
Deswegen weiß ich auch, dass Du von Tutorials.at kommst, ohne dass Du den [tut.at]-Tag in Deinen Betreff geschrieben hast - hier steht bei jeglicher Erwähnung von scanf nämlich ein "Nicht benutzen" dran.
PS: Scheiß Timing, @fat-lobyte

Re: Tutorialfrage 4.2
Verfasst: Di Jul 31, 2012 12:11 pm
von Niko
Also nochmal vielen Dank an alle für die schnelle Hilfe und die gute Erklärung
Ja das scanf für Anfänger nicht so geeignet ist habe ich auch gemerkt und lasse jetzt wohl erstmal die Finger davon
Lg Niko
Re: Tutorialfrage 4.2
Verfasst: Di Jul 31, 2012 12:24 pm
von Xin
Niko hat geschrieben:Also nochmal vielen Dank an alle für die schnelle Hilfe und die gute Erklärung
Ja das scanf für Anfänger nicht so geeignet ist habe ich auch gemerkt und lasse jetzt wohl erstmal die Finger davon

Wenn Du Eingaben an Dein Programm machen möchtest, rate ich Dir für den Anfang
Übergabeparameter zu nutzen. Die musst Du zuwar
selbst konvertieren (atoi), aber das kann man sehr sicher gestalten und es geht ja auch darum, etwas zu lernen und sich ein wenig in der Standard-Lib umzusehen.
Vielleicht liest Du Dir nebenher auch das
C-Tutorial auf proggen.org durch. Je mehr Input Du bekommst, desto besser kannst Du Dir vorstellen, was Du da eigentlich tust und wenn Du Fragen hast, können wir die zum einen Beantworten und zum anderen das Wiki entsprechend ergänzen oder korrigieren.