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 :oops:

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 :oops:
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.