Zum Inhalt springen
View in the app

A better way to browse. Learn more.

Fachinformatiker.de

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

Empfohlene Antworten

Veröffentlicht

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;

}

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.

habe die variablen von double auf float gestellt, jetzt bekommen ich immer 0 als ergebnis :-(

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.

Sorry ich raff es net ganz was ich wegmachen soll, könnte jemand meinen code kopieren und die Sache abändern und einfügen?

Geht leider immer noch nicht hab mal ein screenshot gemacht, vielleicht hilft das ja ein wenig.

fehlerx.jpg

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?

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.

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.

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.

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.

Erstelle ein Konto oder melde dich an, um einen Kommentar zu schreiben.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.