Zum Inhalt springen

Empfohlene Beiträge

Geschrieben

Hallo ich habe seit kurzem an der Uni mit C angefangen und habe nun ein Problem. Ich habe ein kleines Programm geschrieben, welches 2 Kommazahlen miteinander addieren soll. Funktioniert aber irgendwie nicht den nach der eingabe der 1 Zahl bringt er mir im ergebnis schon ne ewig lange minus zahl ohne überhaupt die 2te Zahl abzufragen. Als Software benutze ich Microsoft Visual Studio 2010. Wäre nett wenn mir da einer weiterhelfen könnte. Hier mal der Quellcode:

#include<stdio.h>

int main(){

double a;

double b;

double c;

printf("Zahl1: ");

scanf_s("%f", &a);

printf("Zahl2: ");

scanf_s("%f", &B);

c=a+b;

printf("%f\n",&c);

return 0;

}

Geschrieben

Bis jemand eintrifft, der wirklich helfen kann, versuche ich mich mal. Da ich aber mit Visual Studio wenig Erfahrung habe und etwas erstaunt bin, dass dieser Code überhaupt kompiliert wird, könnte ich natürlich auch falsch liegen.

double a;

scanf_s("%f", &a);
Variable ist double, Format möchte aber Float.
printf("%f\n",&c);

printf erwartet ebenso einen Float, keinen Double und erst recht keinen Pointer.

scanf(_s) besitzt übrigens einen Rückgabewert, nämlich die Anzahl der korrekt eingelesenen Werte. Diesen solltest Du immer überprüfen.

Geschrieben
printf erwartet ebenso einen Float, keinen Double und erst recht keinen Pointer.
Die Formatfelder sind bei printf und scanf nicht gleich. %f funktioniert bei printf für float und double.

habe die variablen von double auf float gestellt, jetzt bekommen ich immer 0 als ergebnis :-(
unbenannt hat dir den richtigen Hinweis schon gegeben: printf erwartet bei %f keinen Zeiger. Der Adressoperator muss also weg.
Geschrieben
Die Formatfelder sind bei printf und scanf nicht gleich. %f funktioniert bei printf für float und double.

Danke für den Hinweis. Ich habe auch noch nie %lf in einem printf benutzt - erschreckend, dass ich das gestern zum ersten Mal machen wollte.

Geht leider immer noch nicht[...]

Zuerst einmal hast Du noch 2 Warnungen offen: der Format-String von scanf erwartet einen Float, den Du aber in einem Double speichern möchtest. Warnungen sind zwar nur Warnungen, aber bewahren manchmal auch vor Fehlern ;)

Ein Gedanke, der mir spontan kommt, den ich aber aufgrund eines fehlenden Windows gerade nicht überprüfen kann: Du benutzt ein Komma als Dezimaltrennzeichen. Jetzt weiß ich nicht, wie dies unter Windows gehandhabt wird, aber normalerweise muss der Punkt genutzt werden.

Zur Erinnerung: scanf besitzt einen Rückgabewert, den man nicht ignorieren sollte. In Deinem Fall beispielsweise:

if (scanf(%lf, a) != 1)

  // Fehlermeldung und Abbruch

Prüfst Du diesen Rückgabewert nicht und scanf konnte das Gewünschte nicht einlesen, wird das Programm mit einem undefinierten Verhalten fortgesetzt. Und genau das scheint mir bei Dir der Fall zu sein.

füg nach dem 1. scanf mal noch ein fflush(stdin); ein.

Ist fflush nicht nur für Ausgabe-Streams geeignet und führt bei STDIN zu undefiniertem Verhalten?

Geschrieben

Danke, immer gut sowas zu wissen.

Jetzt habe ich die Mittagspause einmal dazu genutzt, den Code unter Visual C++ 2005 Express Edition zu testen. Dabei glaube ich, folgende Erkenntnisse gesammelt zu haben:

  • Entweder floats benutzen, oder aber den Formatstring in scanf in "%lf" ändern. Ansonsten kann die Eingabe nicht verarbeitet werden.
  • Dezimaltrennzeichen ist der Punkt
  • fflush(stdin) muss genutzt werden, um den Puffer zu leeren.

Wird das Komma als Dezimaltrennzeichen genutzt, so werden die Nachkommastellen nicht eingelesen. "3,2" wird also zu "3". Wird der Eingabepuffer nicht geleert, wird im nachfolgenden scanf dann sogar versucht, den Rest ",2" zu verarbeiten, was natürlich ins Chaos führt.

Geschrieben

Ich finde das sehr bedenklich, wie ihr hier mit

fflush(stdin)

um euch werft. Diese Zeile führt zu einem undefinierten Ergebnis. Sie ist hier weder notwendig noch sollte man sie benutzen.

PS Das Programm läuft wunderbar, wenn man die %f durch %lf ersetzt und das &-Zeichen in der Ausgabe entfernt.

Geschrieben
Ich finde das sehr bedenklich, wie ihr hier mit

fflush(stdin)

um euch werft. Diese Zeile führt zu einem undefinierten Ergebnis. Sie ist hier weder notwendig noch sollte man sie benutzen.

Wie bereits gesagt stimmt das nicht. Unter Windows (und mit einem Microsoft C Compiler) leert das wie beabsichtigt den Eingabepuffer.

Ob das benötigt wird oder nicht wird uns wohl nur Montana123 sagen können sofern er sich denn nochmal meldet, denn bei mir wird die 2. Eingabe weder mit noch ohne leeren des Eingabepuffers übersprungen.

Geschrieben
Wie bereits gesagt stimmt das nicht. Unter Windows (und mit einem Microsoft C Compiler) leert das wie beabsichtigt den Eingabepuffer.

Ob das benötigt wird oder nicht wird uns wohl nur Montana123 sagen können sofern er sich denn nochmal meldet, denn bei mir wird die 2. Eingabe weder mit noch ohne leeren des Eingabepuffers übersprungen.

Okay, unter deinen stark eingeschränkten Bedingungen wird es gut gehen, hat aber nichts mit ANSI C zu tun und führt somit bei anderen Kombinationen zu unerwarteten Ergebnissen.

Also warum unsicher, wenn es auch besser geht ?

PS Bei mir läuft es auch ohne Buffer löschen einwandfrei.

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...