App installieren
How to install the app on iOS
Follow along with the video below to see how to install our site as a web app on your home screen.
Anmerkung: This feature may not be available in some browsers.
Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden.
Du solltest ein Upgrade durchführen oder ein alternativer Browser verwenden.
Du solltest ein Upgrade durchführen oder ein alternativer Browser verwenden.
C++: Eingaben abfangen (cin)
- Ersteller Nightshift
- Erstellt am
Nightshift
Grand Admiral Special
- Mitglied seit
- 19.08.2002
- Beiträge
- 4.447
- Renomée
- 81
- Standort
- Tief im Weeeeeesss-teheheheeen ;-)
- Mitglied der Planet 3DNow! Kavallerie!
- Aktuelle Projekte
- SIMAP, Docking, POEM
- Lieblingsprojekt
- SIMAP
- Meine Systeme
- Ci7-3770K@3,8 GHz, C2Q 9550@3,4 GHz, AthlonII 620 X4 (+ 2x Ci3-2100, 2x C2D 8400, 9x A4-3420, E-450)
- BOINC-Statistiken
- Prozessor
- Ryzen 7 3700X @stock
- Mainboard
- Gigabyte X570 Aorus Elite
- Kühlung
- Noctua NH-D15 chromax.black
- Speicher
- 2x 16 GB Corsair Vengeance LPX (schwarz) PC4-25600U (DDR4-3200) CL16-18-18-36 @stock
- Grafikprozessor
- Powercolor RX 5700 Red Dragon @stock
- Display
- Eizo FlexScan EV2750
- SSD
- Corsair MP600 1TB M.2 NVMe | Kingston A2000 NVMe PCIe SSD 1TB | Samsung 850 EVO 500 GB
- Optisches Laufwerk
- LG BH16NS55| NEC AD-7203S
- Soundkarte
- onboard :-P der Hardwaregott habe meine Creative Audgiy 2ZS selig
- Gehäuse
- Nanoxia Deep Silence 5, schallgedämmt
- Netzteil
- be quiet! Straight Power E11 650W
- Tastatur
- Razer Ornata Chroma
- Maus
- Logitech Lift for Business
- Betriebssystem
- Win 10 Pro 64bit
- Webbrowser
- Firefox
- Verschiedenes
- rockstable & silent
- Schau Dir das System auf sysprofile.de an
Moin,
Folgendes Problem:
Ich schreibe gerade an einem Programm und will die Eingabe "Dau-sicher" machen - ungültige Zahlenwerte zu korrigieren war total einfach nur muss/will ich auch verhindern, dass mir das Programm nach Einlesen von Buchstaben oder Sonderzeichen anstelle von Zahlen in eine Variable vom Typ int abschmiert.
Ich hab erstmal an failbit etc. gedacht, länger bei google gesucht aber auch keine wirklich besseren Ideen/Ansätze gefunden, nur hat davon leider nichts geholfen (z.B. Prüfung der korrekten Eingabe per cin.fail).
Daher meine Frage:
Was habt ihr für diesen Fall an Ideen auf Lager?
Um das nochmal kurz herauszustellen:
Eingelesen wird in eine Variable vom Typ int bzw. einen Zeiger auf eine Variable vom Typ int.
Auch das konkrete Code-Beispiel kann ich geben falls unbedingt nötig, ist aber ansich unnötig weils ganz einfach die stinknormale Verwendung von cin "ohne alles" ist. (cin >> xyz; ...)
P.S.:
Ich denke da jetzt erstmal an "einfache" Lösungen falls möglich.
Anderen falls muss ich eben eigene Ausnahmebehandlungen einführen oder von string zu int konvertieren, möchte das jedoch möglichst vermeiden mit einer möglichst einfachen Lösung.
.
EDIT :
.
So, hab jetzt doch die Lösung selber gefunden, war ansich schon auf der richtigen spur mit dem failbit.
Hab bisschen was abgeändert und war am Ende mit dem goodbit erfolgreich.
Die Lösung mal zur Dokumentation falls bei jemandem mal die gleiche Frage auftritt:
Damit kann das Thema hier dann von meiner Seite her auch schon wieder zu den Akten gelegt werden.
Folgendes Problem:
Ich schreibe gerade an einem Programm und will die Eingabe "Dau-sicher" machen - ungültige Zahlenwerte zu korrigieren war total einfach nur muss/will ich auch verhindern, dass mir das Programm nach Einlesen von Buchstaben oder Sonderzeichen anstelle von Zahlen in eine Variable vom Typ int abschmiert.
Ich hab erstmal an failbit etc. gedacht, länger bei google gesucht aber auch keine wirklich besseren Ideen/Ansätze gefunden, nur hat davon leider nichts geholfen (z.B. Prüfung der korrekten Eingabe per cin.fail).
Daher meine Frage:
Was habt ihr für diesen Fall an Ideen auf Lager?
Um das nochmal kurz herauszustellen:
Eingelesen wird in eine Variable vom Typ int bzw. einen Zeiger auf eine Variable vom Typ int.
Auch das konkrete Code-Beispiel kann ich geben falls unbedingt nötig, ist aber ansich unnötig weils ganz einfach die stinknormale Verwendung von cin "ohne alles" ist. (cin >> xyz; ...)
P.S.:
Ich denke da jetzt erstmal an "einfache" Lösungen falls möglich.
Anderen falls muss ich eben eigene Ausnahmebehandlungen einführen oder von string zu int konvertieren, möchte das jedoch möglichst vermeiden mit einer möglichst einfachen Lösung.
.
EDIT :
.
So, hab jetzt doch die Lösung selber gefunden, war ansich schon auf der richtigen spur mit dem failbit.
Hab bisschen was abgeändert und war am Ende mit dem goodbit erfolgreich.
Die Lösung mal zur Dokumentation falls bei jemandem mal die gleiche Frage auftritt:
Code:
int xyz
cin >> xyz;
if(cin.good()){}
else
{
cin.clear();
while(cin.get() != '\n');
// hier eventuell noch irgendeine Fehlerbehandlung, Ausgabe, etc.
}
Damit kann das Thema hier dann von meiner Seite her auch schon wieder zu den Akten gelegt werden.
Nachtschicht
Admiral Special
Jo, oder das gute alte sscanf, das ich bevorzuge. Man muss natürlich wissen, was man tut.Damit kann das Thema hier dann von meiner Seite her auch schon wieder zu den Akten gelegt werden.
Ist aber schon eher traurig als witzig, dass das "cout" nicht die Funktionalität des "C"-fprintf errreicht. Würde mich wundern, wenn das bei cin anders wäre.
Zum Glück kann man bei C++ immer noch auf gute C-Funktionen zurückfallen.
Nightshift
Grand Admiral Special
- Mitglied seit
- 19.08.2002
- Beiträge
- 4.447
- Renomée
- 81
- Standort
- Tief im Weeeeeesss-teheheheeen ;-)
- Mitglied der Planet 3DNow! Kavallerie!
- Aktuelle Projekte
- SIMAP, Docking, POEM
- Lieblingsprojekt
- SIMAP
- Meine Systeme
- Ci7-3770K@3,8 GHz, C2Q 9550@3,4 GHz, AthlonII 620 X4 (+ 2x Ci3-2100, 2x C2D 8400, 9x A4-3420, E-450)
- BOINC-Statistiken
- Prozessor
- Ryzen 7 3700X @stock
- Mainboard
- Gigabyte X570 Aorus Elite
- Kühlung
- Noctua NH-D15 chromax.black
- Speicher
- 2x 16 GB Corsair Vengeance LPX (schwarz) PC4-25600U (DDR4-3200) CL16-18-18-36 @stock
- Grafikprozessor
- Powercolor RX 5700 Red Dragon @stock
- Display
- Eizo FlexScan EV2750
- SSD
- Corsair MP600 1TB M.2 NVMe | Kingston A2000 NVMe PCIe SSD 1TB | Samsung 850 EVO 500 GB
- Optisches Laufwerk
- LG BH16NS55| NEC AD-7203S
- Soundkarte
- onboard :-P der Hardwaregott habe meine Creative Audgiy 2ZS selig
- Gehäuse
- Nanoxia Deep Silence 5, schallgedämmt
- Netzteil
- be quiet! Straight Power E11 650W
- Tastatur
- Razer Ornata Chroma
- Maus
- Logitech Lift for Business
- Betriebssystem
- Win 10 Pro 64bit
- Webbrowser
- Firefox
- Verschiedenes
- rockstable & silent
- Schau Dir das System auf sysprofile.de an
Ja in der Tat dürfte sowas mit sscanf ein Stück einfacher sein.
Allerdings weiß ich nicht inwiefern du das mit fprintf meinst, da denke ich eher an (o)fstream als äquivalent anstattt cout.
Jedoch hab ich über den Umfang der Funktionalität von C-Elementen nicht so die Ahnung.
Allerdings weiß ich nicht inwiefern du das mit fprintf meinst, da denke ich eher an (o)fstream als äquivalent anstattt cout.
Jedoch hab ich über den Umfang der Funktionalität von C-Elementen nicht so die Ahnung.
Zuletzt bearbeitet:
Nachtschicht
Admiral Special
Hallo Namensvetter!da denke ich eher an (o)fstream als äquivalent anstattt cout
Dürfte in erster Näherung das Gleiche sein, aber so geübt bin ich da gerade nicht.
Ich glaube kaum, dass man mit C++-Stream-Methoden eine float-Zahl mit 2 Vorkomma- und 3 Nachkommastellen ausgeben kann. Lerne aber gern etwas dazu.
Nightshift
Grand Admiral Special
- Mitglied seit
- 19.08.2002
- Beiträge
- 4.447
- Renomée
- 81
- Standort
- Tief im Weeeeeesss-teheheheeen ;-)
- Mitglied der Planet 3DNow! Kavallerie!
- Aktuelle Projekte
- SIMAP, Docking, POEM
- Lieblingsprojekt
- SIMAP
- Meine Systeme
- Ci7-3770K@3,8 GHz, C2Q 9550@3,4 GHz, AthlonII 620 X4 (+ 2x Ci3-2100, 2x C2D 8400, 9x A4-3420, E-450)
- BOINC-Statistiken
- Prozessor
- Ryzen 7 3700X @stock
- Mainboard
- Gigabyte X570 Aorus Elite
- Kühlung
- Noctua NH-D15 chromax.black
- Speicher
- 2x 16 GB Corsair Vengeance LPX (schwarz) PC4-25600U (DDR4-3200) CL16-18-18-36 @stock
- Grafikprozessor
- Powercolor RX 5700 Red Dragon @stock
- Display
- Eizo FlexScan EV2750
- SSD
- Corsair MP600 1TB M.2 NVMe | Kingston A2000 NVMe PCIe SSD 1TB | Samsung 850 EVO 500 GB
- Optisches Laufwerk
- LG BH16NS55| NEC AD-7203S
- Soundkarte
- onboard :-P der Hardwaregott habe meine Creative Audgiy 2ZS selig
- Gehäuse
- Nanoxia Deep Silence 5, schallgedämmt
- Netzteil
- be quiet! Straight Power E11 650W
- Tastatur
- Razer Ornata Chroma
- Maus
- Logitech Lift for Business
- Betriebssystem
- Win 10 Pro 64bit
- Webbrowser
- Firefox
- Verschiedenes
- rockstable & silent
- Schau Dir das System auf sysprofile.de an
Wohin ausgeben?
Mit ofstream landet meine Ausgabe ja in einer Datei, da wüsste ich gerade keinen Grund weshalb das mit einem derartigen float nicht möglich sein sollte.
Für die Bildschirmausgabe dann eben stattdessen cout, das geht definitiv.
Oder sag mal wie du es genau meinst.
P.S.: Ja das mit dem Namensvetter ist mir auch aufgefallen. ^^
Mit ofstream landet meine Ausgabe ja in einer Datei, da wüsste ich gerade keinen Grund weshalb das mit einem derartigen float nicht möglich sein sollte.
Für die Bildschirmausgabe dann eben stattdessen cout, das geht definitiv.
Oder sag mal wie du es genau meinst.
P.S.: Ja das mit dem Namensvetter ist mir auch aufgefallen. ^^
Nachtschicht
Admiral Special
Na, dann schreib einfach mal den Code auf für genau 2 Stellen vor dem Komma und genau 3 Stellen nach dem Komma für die Ausgabe von 'nem Float mittels Stream-Methoden. Bei (f)printf kein Problem ...Für die Bildschirmausgabe dann eben stattdessen cout, das geht definitiv.
oder sag mal wie du es genau meinst.
Bin mir jetzt auch nicht so völlig sicher, ob das die Schwäche der Stream-Methoden war, aber ich hatte das so in Erinnerung. Ansonsten google ich noch mal.
Jo, diesbezüglich hatten wir schon mal PMs ausgetauscht.P.S.: Ja das mit dem Namensvetter ist mir auch aufgefallen. ^^
Zuletzt bearbeitet:
Nightshift
Grand Admiral Special
- Mitglied seit
- 19.08.2002
- Beiträge
- 4.447
- Renomée
- 81
- Standort
- Tief im Weeeeeesss-teheheheeen ;-)
- Mitglied der Planet 3DNow! Kavallerie!
- Aktuelle Projekte
- SIMAP, Docking, POEM
- Lieblingsprojekt
- SIMAP
- Meine Systeme
- Ci7-3770K@3,8 GHz, C2Q 9550@3,4 GHz, AthlonII 620 X4 (+ 2x Ci3-2100, 2x C2D 8400, 9x A4-3420, E-450)
- BOINC-Statistiken
- Prozessor
- Ryzen 7 3700X @stock
- Mainboard
- Gigabyte X570 Aorus Elite
- Kühlung
- Noctua NH-D15 chromax.black
- Speicher
- 2x 16 GB Corsair Vengeance LPX (schwarz) PC4-25600U (DDR4-3200) CL16-18-18-36 @stock
- Grafikprozessor
- Powercolor RX 5700 Red Dragon @stock
- Display
- Eizo FlexScan EV2750
- SSD
- Corsair MP600 1TB M.2 NVMe | Kingston A2000 NVMe PCIe SSD 1TB | Samsung 850 EVO 500 GB
- Optisches Laufwerk
- LG BH16NS55| NEC AD-7203S
- Soundkarte
- onboard :-P der Hardwaregott habe meine Creative Audgiy 2ZS selig
- Gehäuse
- Nanoxia Deep Silence 5, schallgedämmt
- Netzteil
- be quiet! Straight Power E11 650W
- Tastatur
- Razer Ornata Chroma
- Maus
- Logitech Lift for Business
- Betriebssystem
- Win 10 Pro 64bit
- Webbrowser
- Firefox
- Verschiedenes
- rockstable & silent
- Schau Dir das System auf sysprofile.de an
Ok, dann check mal den hier:
Also egal wohin geschrieben wird es funktioniert mit den 2 Stellen vor und den drei nach dem Komma.
[]edit[]
Aber die Streams von C++ fressen eigentlich sowieso fast alles was man ihnen gibt, man muss sie nur vielleicht noch manipulieren je nachdem was man damit vor hat.
Z.B. für eine Verkehrssimulation mit Verkehrsobjekten könnte man per Operatorenüberladung die Streams so manipulieren, dass sie direkt Instanzen dieser Objekte annehmen und die relevanten Daten davon ausgeben können.
Code:
#include <iostream>
#include <fstream>
using namespace std;
int main ()
{
float a = 12345;
float b = 1000;
cout << (a/b) << endl;
fstream outstream;
outstream.open("test.txt", ios::out);
outstream << (a/b) << endl;
outstream.close();
system("PAUSE");
return 0;
}
Also egal wohin geschrieben wird es funktioniert mit den 2 Stellen vor und den drei nach dem Komma.
[]edit[]
Aber die Streams von C++ fressen eigentlich sowieso fast alles was man ihnen gibt, man muss sie nur vielleicht noch manipulieren je nachdem was man damit vor hat.
Z.B. für eine Verkehrssimulation mit Verkehrsobjekten könnte man per Operatorenüberladung die Streams so manipulieren, dass sie direkt Instanzen dieser Objekte annehmen und die relevanten Daten davon ausgeben können.
Zuletzt bearbeitet:
Nachtschicht
Admiral Special
Komisch, wenn ich den Float a erweitere zu: 12345.1234567, erhalte ich: 12.3451Also egal wohin geschrieben wird es funktioniert mit den 2 Stellen vor und den drei nach demKomma.
Das ist ja irgendwie eine Stelle zuviel. Falls das noch nicht überzeugend ist, würde ich im nächsten Schritt mit der Auffüllung von Leerzeichen oder Nullen herumspielen.
Also, wie ist der Stream-Code?
Aba für so früh ist für mich erst mal Schluss.
Nightshift
Grand Admiral Special
- Mitglied seit
- 19.08.2002
- Beiträge
- 4.447
- Renomée
- 81
- Standort
- Tief im Weeeeeesss-teheheheeen ;-)
- Mitglied der Planet 3DNow! Kavallerie!
- Aktuelle Projekte
- SIMAP, Docking, POEM
- Lieblingsprojekt
- SIMAP
- Meine Systeme
- Ci7-3770K@3,8 GHz, C2Q 9550@3,4 GHz, AthlonII 620 X4 (+ 2x Ci3-2100, 2x C2D 8400, 9x A4-3420, E-450)
- BOINC-Statistiken
- Prozessor
- Ryzen 7 3700X @stock
- Mainboard
- Gigabyte X570 Aorus Elite
- Kühlung
- Noctua NH-D15 chromax.black
- Speicher
- 2x 16 GB Corsair Vengeance LPX (schwarz) PC4-25600U (DDR4-3200) CL16-18-18-36 @stock
- Grafikprozessor
- Powercolor RX 5700 Red Dragon @stock
- Display
- Eizo FlexScan EV2750
- SSD
- Corsair MP600 1TB M.2 NVMe | Kingston A2000 NVMe PCIe SSD 1TB | Samsung 850 EVO 500 GB
- Optisches Laufwerk
- LG BH16NS55| NEC AD-7203S
- Soundkarte
- onboard :-P der Hardwaregott habe meine Creative Audgiy 2ZS selig
- Gehäuse
- Nanoxia Deep Silence 5, schallgedämmt
- Netzteil
- be quiet! Straight Power E11 650W
- Tastatur
- Razer Ornata Chroma
- Maus
- Logitech Lift for Business
- Betriebssystem
- Win 10 Pro 64bit
- Webbrowser
- Firefox
- Verschiedenes
- rockstable & silent
- Schau Dir das System auf sysprofile.de an
Achso, ja das ist nur die Genauigkeit der Ausgabe. Die könntest du z.B. auf 3 Nachkommastellen begrenzen mit setprecision. Dann hättest du die geforderte Anzahl. So gibt er bis auf 4 Nachkommastellen genau aus und deshalb ist die 1 noch mit dabei.
In diesem Fall hier wäre das dann setprecision(5) [da 2 vor, 3 nach dem Komma, du gibst hier die Genauigkeit des gesamten Streams an], um den Manipulator zu benutzen zu können brauchst du aber noch #include <iomanip> für die Präprozessor-Direktiven.
Würde also so aussehen:
Aber meistens will man ja eher mehr als weniger Nachkommastellen für eine höhere Genauigkeit dann würde man die Anzahl per setprecision natürlich erhöhen.
In diesem Fall hier wäre das dann setprecision(5) [da 2 vor, 3 nach dem Komma, du gibst hier die Genauigkeit des gesamten Streams an], um den Manipulator zu benutzen zu können brauchst du aber noch #include <iomanip> für die Präprozessor-Direktiven.
Würde also so aussehen:
Code:
#include <iostream>
#include <iomanip>
#include <fstream>
using namespace std;
int main ()
{
float a = 12345.1234567;
float b = 1000;
cout << setprecision(5) << (a/b) << endl;
fstream outstream;
outstream.open("test.txt", ios::out);
outstream << setprecision(5) << (a/b) << endl;
outstream.close();
system("PAUSE");
return 0;
}
Aber meistens will man ja eher mehr als weniger Nachkommastellen für eine höhere Genauigkeit dann würde man die Anzahl per setprecision natürlich erhöhen.
Nachtschicht
Admiral Special
Konnte noch nicht schlafen
Also wenn ich im letzten Programm "float a = 0.1234567;" setze, erhalte ich: 0.00012346
Das ist nicht das, was gefordert war. Das gewollte Ergebnis wäre 0.000 Vielleicht sollte ich (überflüssigerweise) noch zusätzlich erwähnen, dass Lösungen für alle Zahlen gelten sollten.
Also wenn ich im letzten Programm "float a = 0.1234567;" setze, erhalte ich: 0.00012346
Das ist nicht das, was gefordert war. Das gewollte Ergebnis wäre 0.000 Vielleicht sollte ich (überflüssigerweise) noch zusätzlich erwähnen, dass Lösungen für alle Zahlen gelten sollten.
Nightshift
Grand Admiral Special
- Mitglied seit
- 19.08.2002
- Beiträge
- 4.447
- Renomée
- 81
- Standort
- Tief im Weeeeeesss-teheheheeen ;-)
- Mitglied der Planet 3DNow! Kavallerie!
- Aktuelle Projekte
- SIMAP, Docking, POEM
- Lieblingsprojekt
- SIMAP
- Meine Systeme
- Ci7-3770K@3,8 GHz, C2Q 9550@3,4 GHz, AthlonII 620 X4 (+ 2x Ci3-2100, 2x C2D 8400, 9x A4-3420, E-450)
- BOINC-Statistiken
- Prozessor
- Ryzen 7 3700X @stock
- Mainboard
- Gigabyte X570 Aorus Elite
- Kühlung
- Noctua NH-D15 chromax.black
- Speicher
- 2x 16 GB Corsair Vengeance LPX (schwarz) PC4-25600U (DDR4-3200) CL16-18-18-36 @stock
- Grafikprozessor
- Powercolor RX 5700 Red Dragon @stock
- Display
- Eizo FlexScan EV2750
- SSD
- Corsair MP600 1TB M.2 NVMe | Kingston A2000 NVMe PCIe SSD 1TB | Samsung 850 EVO 500 GB
- Optisches Laufwerk
- LG BH16NS55| NEC AD-7203S
- Soundkarte
- onboard :-P der Hardwaregott habe meine Creative Audgiy 2ZS selig
- Gehäuse
- Nanoxia Deep Silence 5, schallgedämmt
- Netzteil
- be quiet! Straight Power E11 650W
- Tastatur
- Razer Ornata Chroma
- Maus
- Logitech Lift for Business
- Betriebssystem
- Win 10 Pro 64bit
- Webbrowser
- Firefox
- Verschiedenes
- rockstable & silent
- Schau Dir das System auf sysprofile.de an
Aaaah ok jetzt weiß ich was du meinst ... die Anzahl der Nachkommastellen soll unabhängig von der Anzahl der Stellen vor dem Komma immer 3 betragen.
Ja ist auch kein Problem, dafür gibt es "fixed" als Argument - mit setprecision gibt man dann nur noch die Nachkommastellen an:
Ist also möglich.
Kann natürlich sein, dass das in C mit weniger Argumenten/Code geht, aber da kenne ich mich wie gesagt kaum aus.
Ja ist auch kein Problem, dafür gibt es "fixed" als Argument - mit setprecision gibt man dann nur noch die Nachkommastellen an:
Code:
#include <iostream>
#include <iomanip>
#include <fstream>
using namespace std;
int main ()
{
float a = 0.123456789;
float b = 1000;
cout << setprecision(3) << fixed << (a/b) << endl;
fstream outstream;
outstream.open("test.txt", ios::out);
outstream << setprecision(3) << fixed << (a/b) << endl;
outstream.close();
system("PAUSE");
return 0;
}
Ist also möglich.
Kann natürlich sein, dass das in C mit weniger Argumenten/Code geht, aber da kenne ich mich wie gesagt kaum aus.
Zuletzt bearbeitet:
Will man unter C++ (s)printf-Funktionalität, sollte man sich mal boost::format ansehen.
Ähnliche Themen
- Antworten
- 3
- Aufrufe
- 2K
- Antworten
- 0
- Aufrufe
- 23K
- Antworten
- 0
- Aufrufe
- 52K
- Antworten
- 0
- Aufrufe
- 35K