Bei Umlauten läuft die Anwendung Amok!
-
Hi,
ich habe folgendes Programm (gekürtzt):
#include <string> #include <iostream> int main(void) { bool exit = false; while(exit == false) { std::string input; std::cin >> input; std::cout << input << std::endl; if(input == "exit") { exit = true; } } return 0; }Wenn ich das jetzt teste klappt alles einwandfrei. Sobald ich aber umlaute eingebe spielt die Anwendung entweder verrückt oder ich kann eingegeben was ich will ohne das es einen effekt hat. d.h. wenn ich 'exit' eingebe passiert gar nichts...
Kann mir jemand sagen wie ich dieses problem behebe?
Gruß, Prophet05
-
ich nenne dir einfach mal 2 stichpunkte:
wchar_t und basic_stringwobei wchar_t ein datentyp und basic_string ein template ist.
-
codepage
-
also bei mir klappt alles ohne probleme. möglicherweise stecken noch einige zeichen im tastaturpuffer. abhilfe würde schaffen:
fflush(stdin)oder noch besser jedes zeichen aus dem puffer ziehn bis du auf ein "\n" stösst.
-
das klingt aber sehr nach c...warum auf einmal c in c++ einbauen? das ist völlig unnötig. nimm
cin.sync();//eingabepuffe löschen cin.clear();//fehlerzustände beseitigen
-
ConfusedGuy schrieb:
ich nenne dir einfach mal 2 stichpunkte:
wchar_t und basic_stringwobei wchar_t ein datentyp und basic_string ein template ist.
Was issen das für ein Tip? Sag ihm doch gleich, er soll std::wstring benutzen und die dazugehörige std::wcin.
-
jup, hatte ich vergessen. ruhig blut..
naja, vielleicht versteht er jetzt warum es nicht funktioniert hat
-
Vielen dank für eure hilfe. Ich habe beide varianten ausprobiert. mit sync und clear hat es geklappt. Als ich es mit wstring und wcin versucht habe ist das programm wieder amok gelaufen. Muss ich da auch clear und sync aufrufen?
Nun zu einem anderen Programm was ähnliche probleme hat. Ich habe mit hilfe der Base Bibliothek von wxWidgets geschrieben. Das problem war das dort keine schnittstelle für die C++ Streams vorhanden ist. Also habe ich die dort integrierten c funktionen verwendet um an die daten zu kommen. Ziel des Programms ist es das ich während der eingabe durch den anwender andere dinge machen kann. Bis jetzt sieht es so aus:
#include <iostream> #include <wx/string.h> #include <wx/utils.h> bool ValidCommandChar(wxChar c) { return !wxIscntrl(c); } int main(void) { // when the application shall exit this is set to true. bool Exit = false; // Contains all characters from input that do not form a complete // command yet. wxString ReadBuffer; // Contains a completed command if availible. wxString CurrentCommand; // Application loop. while(Exit == false) { // Character buffer for reading input. wxChar Buffer; // Reset CurrentCommand so that no commands from last loop are procesed. CurrentCommand = wxT(""); // Read a char from the standard input. Buffer = (wxChar)wxFgetc(stdin); // If the char is a newline (command termination) if(Buffer == (wxChar)wxT('\n')) { // The CurrentCommand is set. CurrentCommand = ReadBuffer; // And the ReadBuffer is cleared. ReadBuffer = wxT(""); } // else add the char to the read buffer as long it is a valid command char. else if(ValidCommandChar(Buffer)) { // Add it to the ReadBuffer. ReadBuffer += Buffer; } // Do something else. wxMicroSleep(1000); // If "exit" is the command, then quit the application. if(CurrentCommand == wxT("exit")) { Exit = true; } } return 0; }Dort gibt es das selbe problem mit umlauten. Ich verwende die Unicode Variante der bibliothek das heißt es sollte dort theoretisch keine probleme geben. Allerdings ist wxFgetc nur eine weiterleitung auf die alte c funktion. Daher vermute ich das problem dort. Ich habe auch versucht fflush(stdin) im anschluss aufzurufen aber das hat nichts gebracht außer das der fehler noch schlimmer wurde. ich hoffe ihr könnt mir auch hiermit helfen.
-
Ich pushe den Post jetzt mal in der Hoffnung das mir noch jemand helfen kann. Vielleicht entspricht der letzte Post auch nicht mehr ganz dem Topic dieses Forums. Wäre also nett wenn es entsprechend verschoben wird.