Array behällt "new line" und "überspringt" Eingabe



  • Grizzy schrieb:

    Ich hab das ganze abgeändert zu

    printf("Bitte Rechenoperation eingeben: ");
    
        fgets (operand, 2, stdin);
    

    Das Problem bleibt das gleiche.

    2 ist auch ein bisschen wenig Platz für den Operator, das '\n' von der Entertaste (dein Problem) und den Stringterminator '\0'.

    Ob du die gesamte Zeile gelesen hast, kannst du daran erkennen, dass das '\n' im String mit abgelegt wurde.

    Und auch wenn du das auf 3 änderst, was reicht, ist das doch etwas geizig.

    Das ist alles kein Geheimnis sondern ist in jeder Referenz/Man page nachzulesen.

    Grizzy schrieb:

    EDIT: atof nimmt Code::Blocks nicht, atoi schon ...

    DAs ist eine sehr ausagekräftige und genaue Fehlerangabe 👍

    Der Compiler macht i.A. sehr genaue Angaben, was ihm nicht gefällt oder womit er Probleme hat.
    Auch wenn du damit nichts anfangen kannst, können es Andere. Dazu braucht man aber den genauen Wortlaut der Meldungen (Copy&Paste)

    Und die richtige Funktion wäre auch strtod



  • Ich entschuldige mich für die ungenaue Angabe, du hast natürlich Recht.

    Punkt 1:

    Ich habe den Wert auf 4 erhöht, man soll ja Speicherplatz sparend arbeiten. In der gängigen Lektüre heißt es ja "Es wird bis "new Line" oder EOF eingelesen", nicht und EOF. Deshalb habe ich das nicht berücksichtigt.

    Jetzt funktioniert es wie es soll, Danke!

    Punkt 2:

    Ich bekam die Meldung

    Unresolved external '_atof' referenced from
    

    Nachdem ich das Programm nach einer Pause neu gestartet habe compiliert er anstandslos.

    Ein letztes Problem bleibt noch.

    Punkt 3:

    Der erste, eingegebene Zahlenwert wird nicht verarbeitet. Ich kann leider nicht feststellen wo das Problem genau liegt, da ich keine "watches" im Debugger nutzen kann, da Code::Blocks diesbezüglich allem Anschein nach nicht mit Borland zusammen arbeitet.

    Wenn ich die gleichen Files in Dev-Cpp öffne und dann compiliere funktioniert es, da wird die erste, eingegebene Zahl verarbeitet so wie es soll.

    EDIT:

    Wo liegt denn der Unterschied zwischen atof and strtod? Ich hatte durch meine Suche nach den entsprechenden Kommandos nur atof gefunden.



  • Grizzy schrieb:

    Ich habe den Wert auf 4 erhöht, man soll ja Speicherplatz sparend arbeiten.

    Ich würde behaupten, auf modernen Prozessoren kannst du bis 64 Bytes (Cacheline) gehen, bevor du mit ganz, ganz viel Glück überhaupt was messen kannst.

    Grizzy schrieb:

    Der erste, eingegebene Zahlenwert wird nicht verarbeitet. Ich kann leider nicht feststellen wo das Problem genau liegt, da ich keine "watches" im Debugger nutzen kann, da Code::Blocks diesbezüglich allem Anschein nach nicht mit Borland zusammen arbeitet.

    Und einfach printf für die Ausgabe zu verwenden kommt nicht in Frage?

    Grizzy schrieb:

    Wo liegt denn der Unterschied zwischen atof and strtod? Ich hatte durch meine Suche nach den entsprechenden Kommandos nur atof gefunden.

    Wo zur Hölle hast du gesucht?



  • dachschaden schrieb:

    Und einfach printf für die Ausgabe zu verwenden kommt nicht in Frage?

    Das wäre ja zu einfach 🙄

    dachschaden schrieb:

    Wo zur Hölle hast du gesucht?

    Wenn man das Kommando nicht kennt, wie genau soll man danach suchen? Ich habe nach einer Möglichkeit gesucht, strings in integer/float Zahlen umzuwandeln. Die erste Ergebnisseite war nur atoi.



  • @DirkB

    Ich habe es jetzt zu strtod umgeändert, funktioniert sehr gut und ist deutlich kürzer, Danke für deine Hilfe!
    Nichts desto trotz werde ich dann mal die Tage mit printf gucken wo genau das Problem liegt, dass Code::Blocks die erste Zahl nicht verarbeitet, Dev-Cpp schon.

    Danke euch allen die sich die Mühe gemacht haben!



  • Grizzy schrieb:

    Das wäre ja zu einfach 🙄

    Dann beschwere dich nicht.

    Grizzy schrieb:

    Wenn man das Kommando nicht kennt, wie genau soll man danach suchen?

    Grizzy schrieb:

    Wo liegt denn der Unterschied zwischen atof and strtod?

    Ich bezog mich nicht darauf, dass du strtod nicht gefunden hast, sondern dass du augenscheinlich an der falschen Stelle nach Dokumentation für strtod gesucht hast.

    "Oh, ich sehe hier strtod , das kann auch Strings in double s umwandeln, aber meine Dokumentation gibt mir keine Informationen darüber. Anstatt also mal Google zu verwenden, frage ich lieber noch mal nach, obwohl mir diese Leute auch nichts anderes sagen werden".

    Aber weißt du was? Verschissen hast du so oder so - c string to float kann man auch googlen, beschreibt exakt deine Fragestellung, und zeigt dir alles, was du brauchst.



  • dachschaden schrieb:

    Dann beschwere dich nicht.

    Ich habe mich lediglich über mich selbst geärgert.

    dachschaden schrieb:

    Aber weißt du was? Verschissen hast du so oder so - c string to float kann man auch googlen, beschreibt exakt deine Fragestellung, und zeigt dir alles, was du brauchst.

    Genau danach habe ich bei google gesucht:

    string in zahl umwandeln c
    

    Und die ersten Ergebnisse sind alle atoi, und wenn man die Alternativen nicht kennt, kann man auch nicht danach suchen, eigentlich selbstverständlich...



  • @DirkB

    Ich habe auch den Fehler gefunden, warum der Wert abhanden gekommen ist. Da die Arrays für die Zahlen nur 12 Stellen haben und er bei der zweiten Zahl bei der Zuweisung über diese 12 Stellen hinaus gekommen ist, hat er die erste überschrieben. Wenn die Zahlen ausreichen viele Stellen haben, passiert dies nicht.



  • Grizzy schrieb:

    Genau danach habe ich bei google gesucht

    Auf Deutsch. So was machst du am Besten immer in Englisch.



  • Grizzy schrieb:

    Ich entschuldige mich für die ungenaue Angabe, du hast natürlich Recht.

    Punkt 1:

    Ich habe den Wert auf 4 erhöht, man soll ja Speicherplatz sparend arbeiten. In der gängigen Lektüre heißt es ja "Es wird bis "new Line" oder EOF eingelesen", nicht und EOF. Deshalb habe ich das nicht berücksichtigt.

    Jetzt funktioniert es wie es soll, Danke!

    New Line ist das '\n'
    EOF steht für End of File. Das ist in diesem Fall kein Zeichen, sondern ein Zustand.
    Da kommen keine Zeichen mehr, also kann auch kein weiteres abgespeichert werden.
    '\0' kennzeichnet das Stringende in C. Wenn das fehlt, kannst du keine Stringfunktionen aus der Standardbibliothek benutzen.

    Diesen Speichergeiz kannst du auf Mikrocontrollern ausleben, aber nicht unbedingt auf einem modernen PC, wo auch noch ein Mensch die Eingabe macht.



  • Wieder etwas dazu gelernt, jetzt funktioniert ja alles wie es soll. Danke nochmal!


Anmelden zum Antworten