Absturz bei String-Eingaben in Integer-Variablen
-
hi!
mein problem momentan:
durch untigen code wird eine eingabe vom user gefragt:int eingabe=0; std::cin>>eingabe; switch (eingabe) { case 1: exit(0); break; }
wenn nun der benutzer aber statt einer zahl einen string eingibt, dann stürtzt das proggy ab.
Wie kann ich das abfangen? Habe schon try/catch-schleifen versucht, oder defaults im switch oder ifs. Aber hat alles nix gebracht.danke für eure Hilfe!!!
mfg,
chris90PS: Auch das FAQ hat nix gebracht
-
Lies die Eingabe doch zuerst in einen String ein,
danach überprüfst du auf glültige bzw. ungültige Zeichen.
Mit der Function "atoi" kannst du dann den String in eine int- Zahl umwandeln.
-
vielen dank! @ *Danny*
klar, mit "atoi" gehts!!
Ich habe aber grade noch ein problem, und zwar:int eingabe1, eingabe2; std::cout<<"Bitte gib in dieses Feld 'hallo' ein: "<<endl; std::cin>>eingabe1; std::cout<<"Bitte gib in dieses Feld 'ciao' ein:"<<endl; std::cin>>eingabe2; std::cout<<"Dankeschön!!";
wenn der benutzer bei eingabe1 gleich "hallo ciao" eingibt, dann denkt die console, er hätte zwei voneinander unabhängige eingaben gemacht. Folglich erscheint das "Dankeschön!!" gleich. Wie kann ich es anstellen, dass der User auch eingaben mit Leerzeichen machen kann, die wie ein String behandelt werden und nicht wie mehrere?
Ich habe schon herumexperimentiert mit Platzhaltern wie " *Space* ", die dann im nachhinein in spaces konvertiert werden. Aber das ist etwas umständlich.
Gibt es dafür auch so eine einfache Lösung wie oben?mfg,
chris90
-
Wenn mich nicht alles täuscht kann man dazu
cin.get(variable, länge) //oder gets(variable)
benutzen da sie einlesen bis Return gedrückt wird.
Gruß Treva
-
Danke!!
So, nächstes Problem (nein, ich kann c++).
Also, wenn ich eine Datei über eine Funktion versuche in eine andere zu kopieren, dann läuft das bei mir nur bei Textdateien fehlerfrei. bei Binärdateien (wie *.exe) jedoch kopiert er nur bis die Zieldatei eine Größe von 1,32 Kbyte hat. Warum? Bei Textdateien ist die Größe der Zieldatei egal.
Funktion zum Kopieren:bool CopyFile (string source, string destination) // from Michiel Blokzijl, changed by CAS { CFile dat_in; // Defines two streams, one for the opening file, // the other one for the saving file ofstream dat_out; dat_in.Open(source, IN); //Opens the source file dat_out.open(destination.c_str(), ios::out | ios::trunc); // Opens the destination file, or creates it string line_content; //Buffer for lonely lines from the source file int loop = 0; //counts the loops if(!dat_in.File) // if source file doesn't exist, //stop the function { cout << "File couldn't be opend!" << endl; return false; } else //else go on { while(loop < dat_in.length-1) // As long as file end //isn't reached, { line_content = dat_in.Content.substr(loop,1); dat_out << line_content; loop++; } dat_in.File.close(); dat_out.close(); return true; } }
Warum kopiert er so unvollständig bei *.exe-dateien?
Bitte helft mir!
mfg,
chris90PS: Vielen Dank @Treva. Jetzt ge(h)ts!!
-
Ok, hab noch mal umfangreiche Tests gemacht:
Also, die Funktion hat Probleme mit einem Zeichen (nicht sichtbar , da Charcode 26). Bei diesem hört sie immer auf mit dem Kopieren. Wenn mann alle diese Zeichen aus der exe-datei entfernt, dann Kopiert sie alles ganz normal in die Zieldatei.Hab auch mal bei cppreference.com nachgeschaut, zum zeichen nr.26 steht da folgendes:
Code:26
Oktal:32
Hexa: 1A
Zeichen: SUB
Beschreibung: substituteWarum hat die Funktion Probs mit dem Kopieren von diesem ??
mfg,
chris90PS: Hört c++ an dieser Stelle auf, Zeichen in einen string zu kopieren, oder bedeutet es vielleicht datei-ende??
-
Anstatt gets() bitte fgets() verwenden. Bei ersterem kann es leicht zu Bufferoverflows kommen!
@chris90
Du musst die Dateien im Binärmodus öffnen, lesen und schreiben! Beim Kopieren solltest du das generell machen.