Montana123 Geschrieben 20. Oktober 2010 Geschrieben 20. Oktober 2010 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", &; c=a+b; printf("%f\n",&c); return 0; } Zitieren
unbenannt Geschrieben 20. Oktober 2010 Geschrieben 20. Oktober 2010 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. Zitieren
Montana123 Geschrieben 20. Oktober 2010 Autor Geschrieben 20. Oktober 2010 habe die variablen von double auf float gestellt, jetzt bekommen ich immer 0 als ergebnis :-( Zitieren
Klotzkopp Geschrieben 20. Oktober 2010 Geschrieben 20. Oktober 2010 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. Zitieren
Montana123 Geschrieben 21. Oktober 2010 Autor Geschrieben 21. Oktober 2010 Sorry ich raff es net ganz was ich wegmachen soll, könnte jemand meinen code kopieren und die Sache abändern und einfügen? Zitieren
Klotzkopp Geschrieben 21. Oktober 2010 Geschrieben 21. Oktober 2010 Bei printf muss das & weg. Zitieren
Montana123 Geschrieben 21. Oktober 2010 Autor Geschrieben 21. Oktober 2010 Geht leider immer noch nicht hab mal ein screenshot gemacht, vielleicht hilft das ja ein wenig. Zitieren
Guybrush Threepwood Geschrieben 21. Oktober 2010 Geschrieben 21. Oktober 2010 füg nach dem 1. scanf mal noch ein fflush(stdin); ein. Zitieren
unbenannt Geschrieben 21. Oktober 2010 Geschrieben 21. Oktober 2010 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? Zitieren
Guybrush Threepwood Geschrieben 21. Oktober 2010 Geschrieben 21. Oktober 2010 Ist fflush nicht nur für Ausgabe-Streams geeignet und führt bei STDIN zu undefiniertem Verhalten? Unter Windows löscht es die restlichen Zeichen im Eingabebuffer. Da der 2. scanf Aufruf scheinbar übersprungen wird ist das Problem wohl das da noch das Return vom ersten drin steckt. Zitieren
unbenannt Geschrieben 22. Oktober 2010 Geschrieben 22. Oktober 2010 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 Punktfflush(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. Zitieren
Korhil Geschrieben 26. Oktober 2010 Geschrieben 26. Oktober 2010 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. Zitieren
Guybrush Threepwood Geschrieben 26. Oktober 2010 Geschrieben 26. Oktober 2010 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. Zitieren
Korhil Geschrieben 26. Oktober 2010 Geschrieben 26. Oktober 2010 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. Zitieren
Empfohlene Beiträge
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.