[tut.at] Tutorialfrage 4.2

Schnelle objektorientierte, kompilierende Programmiersprache.
Antworten
Niko
Beiträge: 3
Registriert: Mo Jul 30, 2012 9:12 am

[tut.at] Tutorialfrage 4.2

Beitrag von Niko » Mo Jul 30, 2012 9:24 am

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.
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.

Benutzeravatar
cloidnerux
Moderator
Beiträge: 3125
Registriert: Fr Sep 26, 2008 4:37 pm
Wohnort: Ram (Gibts wirklich)

Re: Tutorialfrage 4.2

Beitrag von cloidnerux » Mo Jul 30, 2012 9:39 am

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.
Redundanz macht wiederholen unnötig.
quod erat expectandum

Niko
Beiträge: 3
Registriert: Mo Jul 30, 2012 9:12 am

Re: Tutorialfrage 4.2

Beitrag von Niko » Mo Jul 30, 2012 9:44 am

Vielen Dank so hat es funktioniert :)

Aber wieso erkennt er + und - nicht als Zahl an, sonder nur * ?

Benutzeravatar
fat-lobyte
Beiträge: 1398
Registriert: Sa Jul 05, 2008 12:23 pm
Wohnort: ::1
Kontaktdaten:

Re: Tutorialfrage 4.2

Beitrag von fat-lobyte » Mo Jul 30, 2012 11:25 am

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
Haters gonna hate, potatoes gonna potate.

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8862
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: Tutorialfrage 4.2

Beitrag von Xin » Mo Jul 30, 2012 11:28 am

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 ;-)
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

Niko
Beiträge: 3
Registriert: Mo Jul 30, 2012 9:12 am

Re: Tutorialfrage 4.2

Beitrag von Niko » Di Jul 31, 2012 12:11 pm

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

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8862
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: Tutorialfrage 4.2

Beitrag von Xin » Di Jul 31, 2012 12:24 pm

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.
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

Antworten