stringstream Ärger (oder woran auch immer es liegt)
-
Dieser Beitrag wurde gelöscht!
-
@Swordfish sagte in stringstream Ärger (oder woran auch immer es liegt):
Schau mal Im Menü "Settings" ~> "Compiler Settings", da kannst Du -std=C++17 auswählen. Dann klapps auch mit
std::begin()
(hoffentlich)Geil, ich kann es nun ausführen, Danke!
@Swordfish sagte in stringstream Ärger (oder woran auch immer es liegt):
Hm, irgendwas stimmt da nicht:
xD Pro Zeile lässt sich nur eine Operation ausführen, also bitte nicht 123+123*123 statt dessen 123+123, dann Enter und mit dem Ergebnis weiter machen, also 246 * 123. Die millionen Nachkommastellen entstehen durch
cout << fixed; cout << setprecision(15);
Zu meiner Problematik, führe bitte kurz nur das hier aus, hier entsteht das Problem:
#include <iostream> #include <sstream> #include <string> #include <cmath> using namespace std; int main() { int i; double num1; double num2; string strInput; string operation; string subStrInput; cin >> strInput; for(i = 0; i <= strInput.length(); i++) { subStrInput = strInput[i]; if(subStrInput == "/") { stringstream(strInput.substr(0, i)) >> num1; operation = strInput[i]; stringstream(strInput.substr(i, strInput.length())) >> num2; } } cout << num1 << endl; cout << operation << endl; cout << num2 << endl; return 0; }
Teste mal mit allen vier Operationen und schaue dir anschließend die Werte der drei Variablen an, dann wird es offensichtlich. Mit '+' funktioniert es, bei den restlichen Operationen (- * /) gibt 'num2' = 0 zurück, und dass verstehe ich nicht
-
#include <iostream> #include <sstream> #include <string> // #include <cmath> wofür? using namespace std; int main() { double num1; double num2; char operation; string strInput; cin >> strInput; for (int i = 0; i < strInput.length(); i++) { char ch = strInput[i]; if (ch == '+' || ch == '-' || ch == '*' || ch == '/') { stringstream(strInput.substr(0, i)) >> num1; operation = ch; stringstream(strInput.substr(i + 1, strInput.length() - i - 1)) >> num2; break; } } cout << num1 << '\n' << operation << '\n' << num2 << "\n\n"; }
Aber das ist extrem hässlich. Womit lernst Du?
Diese 75 Zeilen tun so ungefähr das, was Dein Code wohl tun soll:
#include <limits> #include <iostream> int main() { std::cout << "Welcome to my very cute calculator :)\nEnter 'r' for reset or 'e' for exit\n\n"; bool reset = true; for (double result = 0;;) { double lhs, rhs; if (reset) { while (!(std::cin >> lhs)) { std::cin.clear(); if (std::cin.peek() == 'e') { std::cout << "\n\nBye :)\n\n"; return 0; } std::cerr << "\nInput Error. A number, please, or 'e' for exit.\n\n"; std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); } reset = false; } else { std::cout << "=\n" << result; lhs = result; } char operation; std::cin >> std::skipws >> operation; if (operation == 'e') { std::cout << "\n\nBye :)\n\n"; return 0; } if (operation == 'r') { reset = true; std::cout.put('\n'); continue; } if (operation != '+' && operation != '-' && operation != '*' && operation != '/') { std::cerr << "\nOperation '" << operation << "' is not supported :(\n" "Supported operations are '+', '-', '*', '/' and 'r' for reset.\n\n"; std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); continue; } while (!(std::cin >> rhs)) { std::cerr << "\nInput Error. A number, please.\n\n"; std::cin.clear(); std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); } switch (operation) { case '+': result = lhs + rhs; break; case '-': result = lhs - rhs; break; case '*': result = lhs * rhs; break; case '/': result = lhs / rhs; break; } } }
-
@Swordfish Es ist nicht schön, aber kannst du erkennen woran es liegt??
@Swordfish sagte in stringstream Ärger (oder woran auch immer es liegt):
Diese 75 Zeilen tun so ungefähr das, was Dein Code wohl tun soll:
Danke, ich versuche die Zeilen mal zu verdauen. Dein anderes Monstrum liegt weit über meinen aktuellen Bildungsstand
Ich fange gerade mit einen guten Anfänger Tutorial auf YT an, und mittendrin habe ich versucht einen Taschenrechner zu bauen. Möglicherweise überstürze ich mich
-
-
@Swordfish Oh sry, Danke. Es lag also an dem break?
-
@Cayz: Du hast wohl die Änderung in Zeile 24 nicht gesehen?
Ansonsten lass dir mal den Ausdruck dort ausgeben:cout << "num2: " << strInput.substr(i, strInput.length()) << endl;
Btw: Die Änderung des 2. Parameters ist egal (es wird sonst bis Stringende gelesen), wenn schon richtig gerechnet, dann
strInput.length() - i - 1
.
-
@Th69 sagte in stringstream Ärger (oder woran auch immer es liegt):
Du hast wohl die Änderung in Zeile 24 nicht gesehen?
und die bedingung der
for
-Schleife.@Cayz Nein. Das
break
ist nur dazu da, daßi
nicht völlig sinnlos weiterläuft obwohl schon alles erledigt ist. Vergleiche den Code mal etwas genauer mit Deinem.Trotzdem nochmal:
@Swordfish sagte in stringstream Ärger (oder woran auch immer es liegt):
Womit lernst Du?
@Th69 sagte in stringstream Ärger (oder woran auch immer es liegt):
wenn schon richtig gerechnet, dann
strInput.length() - i - 1
.Uuups
-
@Swordfish sagte in stringstream Ärger (oder woran auch immer es liegt):
@Swordfish sagte in stringstream Ärger (oder woran auch immer es liegt):
Womit lernst Du?
oben im edit. Was würdest du empfehlen?
-
@Cayz sagte in stringstream Ärger (oder woran auch immer es liegt):
Ich fange gerade mit einen guten Anfänger Tutorial auf YT an, und mittendrin habe ich versucht einen Taschenrechner zu bauen. Möglicherweise überstürze ich mich
Woher weißt Du daß das ein gutes Anfängertutorial ist?
@Cayz sagte in stringstream Ärger (oder woran auch immer es liegt):
Was würdest du empfehlen?
Ein Lehrbuch. Da drüben
(Buch-) Empfehlung zum Einstieg in die Programmierung mit C++ gesucht
vielleicht mal reinschauen.
-
@Swordfish Ok super. Danke für alles, ihr seid echt toll^^ seid ihr hier ehrenamtlich unterwegs?
-
@Cayz sagte in stringstream Ärger (oder woran auch immer es liegt):
seid ihr hier ehrenamtlich unterwegs?
Natürlich.
-
@Swordfish Verstehe, dann nochmal tausend Dank!
-
Dieser Beitrag wurde gelöscht!
-
@Swordfish Sry, die Frage musste umstrukturiert werden. Damit auch größere Zahlen ordentlich ausgegeben werden, muss mit
precision
manipuliert werden. Vorsichtshalber lässt sich mitsetprecision(15)
fast jede Zahl ausgeben, auch wenn bei kleineren Fällen immer 15 Stellen angezeigt werden. Um vor jeder Ausgabe die geeignete Anzahl 'n' insetprecision(n)
heraus zu finden, könnte man die Anzahl Ziffern während dem String-Input auslesen, aber in diesem Fall wird mit mindestens zwei Nummern gerechnet. Wie könnte man es schaffen, die Anzahl im Ergebnis zu lesen und diese vor der Ausgabe in 'n' vonsetprecision(n)
einfügen?
-
Dieser Beitrag wurde gelöscht!
-
Bist Du eigentlich zu blöd, selbst mal was zu recherchieren?
Wenn Du << fixed weglässt, bekommst Du mit << setprecision(15) was Du möchtest!
-
@Belli Wäre ich dazu zu blöd, wäre ich nicht ansatzweise in der Lage gewesen nach einen einstündigen Tutorial über Basics wie Input/Output in ++ meine Zeilen hinzuklatschen. Eben weil ich recherchiert habe und irgendwann nicht weiter kam bzw. nicht mehr selber die Kinderkrankheiten dieser Zeilen ausbügeln konnte, habe ich mich an ein Forum gewendet.
Leute wie du, die direkt beleidigend werden, beweisen mal wieder, dass man sich von deutschen Communities lieber fern hält. In englischen Foren geht es nicht ansatzweise zu wie hier. Traurig.
Trotzdem Danke. Stell dir vor, du lässt den ersten Satz weg, dann wäre deine Antwort ein Vorzeigemodell. Denk mal drüber nach, und generell in Zukunft bevor du dich im Netz bewegst. Einfach mal tief Luft holen
-
@Cayz sagte in stringstream Ärger (oder woran auch immer es liegt):
wäre ich nicht ansatzweise in der Lage gewesen nach einen einstündigen Tutorial über Basics wie Input/Output in ++ meine Zeilen hinzuklatschen.
Ohne beleidigend werden zu wohlen, möchte ich dich ganz höflich darauf hinweisen, das nicht zu überschätzen
-
@Mechanics Ich möchte nur implizieren dass ich zum recherchieren nicht zu Blöd bin Ich habe erst angefangen zu basteln, mehrere Zeilen, dann versucht über try&error und den richtigen Sucheingaben 90% selber zu lösen, und schließlich bin ich hier gelandet. Ich würde nicht auf die Idee kommen ein Thread aufzumachen mit dem Titel "Wie bastelt man einen Taschenrechner".
Eurer Hilfestellung bin ich wirklich dankbar. Manchmal ist die Lösung so simpel dass man es übersieht, und eine kurze Antwort erspart einem dann doch eine Menge Zeit.