std::locale wirt exception
-
-
Tachyon schrieb:
Die Namen für die locales sind leider stark plattformanhängig. Vermutlich ist der Name für die Plattform auf der Du testest einfach falsch.
Ich "teste" auf Windows 7. Gibt es keinen Konsolen-Befehl zum auflisten aller gültiger Namen?
-
314159265358979 schrieb:
trololol
google itHab ich doch! Ist praktisch Zeitverschwendung!Edit: Nein, doch nicht. Aber trotzdem.
-
*push* Bitte nicht ignorieren. Nach einer Weile herumsuchens bin ich auf nichts gestoßen. Kennt ihr nicht vielleicht ein paar Seiten oder so? Welche benutzt ihr? Der Standard ist leider auch schweigend. Und nach mehr als 20 Herumprobierereien hab ich auch keinen Bock mehr.
Es kann doch nicht sein, dass ich jetzt keine Locals mehr benutzten kann!?
-
Die Lösung wurde doch schon genannt: Benutze den compilerspezifischen String.
-
Michael E. schrieb:
Die Lösung wurde doch schon genannt: Benutze den compilerspezifischen String.
Danke
! Aber wo wurde die denn genannt? Im anderen Link?
-
Hacker schrieb:
Michael E. schrieb:
Die Lösung wurde doch schon genannt: Benutze den compilerspezifischen String.
Danke
! Aber wo wurde die denn genannt? Im anderen Link?Also compilerspezifisch ist nicht ganz richtig, eher plattformspezifisch. Plattformunabhängig sind nur die locales "C" (im Prinzip US-Englisch) und "" (die Systemlocale). Die anderen musst du eben nachschlagen. Wobei ich noch nie den Grund verstanden habe, wieso man etwas anderes nehmen sollte als "" (oder "C"), denn ich will nicht, dass ein Programm plötzlich eine ungewöhnte Locale benutzt, bloß weil es von einem Deutschen programmiert wurde. Da ist doch der ganze Sinn von Loacales futsch, wenn das Programm nicht die Systemlocale (und damit meine Sprache) benutzt (oder wenn es sein muss die Standardlocale), sondern die Sprache des Programmierers. Wieso hätte mich als Nutzer zu interessieren, wie der Programmierer in der Schule seine Dezimaltrennzeichen geschrieben hat? Oder noch schlimmer wird's wenn das Programm noch einen andere Zeichensatz erzwingt als den meiner Ausführungsumgebung. Ich wüsste nicht einmal aus dem Kopf, wie ich in meiner Konsole ein UTF-32 Zeichen tippen kann.
-
SeppJ schrieb:
Hacker schrieb:
Michael E. schrieb:
Die Lösung wurde doch schon genannt: Benutze den compilerspezifischen String.
Danke
! Aber wo wurde die denn genannt? Im anderen Link?Also compilerspezifisch ist nicht ganz richtig, eher plattformspezifisch. Plattformunabhängig sind nur die locales "C" (im Prinzip US-Englisch) und ....
Naja, jedenfalls funktioniert das "Programm" mit der system-lokale auch nicht - und wenn man dann (deiner Argumentation folgend) keine anderen nehmen sollte, hat man ja keine Wahl, als toupper, bzw. tolower selbst zu implementieren.
-
So so! es funktioniert also nicht. Lies dir doch bitte mal den ersten Link in meiner Signatur gründlich durch und stell dann noch einmal eine brauchbare Frage.
(Dass ich das mal bei jemandem mit 1500 Beiträgen schreiben muss
)P.S.: Du sagst also, dass
http://ideone.com/jbkvZ
bei dir eine Exception wirft?
-
SeppJ schrieb:
So so! es funktioniert also nicht. Lies dir doch bitte mal den ersten Link in meiner Signatur gründlich durch und stell dann noch einmal eine brauchbare Frage.
(Dass ich das mal bei jemandem mit 1500 Beiträgen schreiben muss
)Ok.
Nein, es funktioniert nicht, da es einfach Umlaute ignoriert (was Michael E. furchtbar blöd findet - und ich auch). Das sollte es aber nicht, wenn das globale locale auf German gesetzt wurde. Also?

-
Hacker schrieb:
Nein, es funktioniert nicht, da es einfach Umlaute ignoriert (was Michael E. furchtbar blöd findet - und ich auch). Das sollte es aber nicht, wenn das globale locale auf German gesetzt wurde. Also?

So so! "Es" "ignoriert" Umlaute. Dann ist ja jetzt alles klar.
-
SeppJ schrieb:
Hacker schrieb:
Nein, es funktioniert nicht, da es einfach Umlaute ignoriert (was Michael E. furchtbar blöd findet - und ich auch). Das sollte es aber nicht, wenn das globale locale auf German gesetzt wurde. Also?

So so! "Es" "ignoriert" Umlaute. Dann ist ja jetzt alles klar.
Kennst du den anderen Thread nicht?
#include <iostream> #include <string> void firstToupperOtherTolower(std::string& str) { if(str.length()) str.at(0) = toupper(str.at(0)); for(std::string::size_type a(1);a < str.length();++a) str.at(a) = tolower(str.at(a)); } int main() { std::locale::global(std::locale("")); std::string vorname, nachname; std::cout << "Bitte Vornamen eingeben: "; std::getline(std::cin, vorname);///PI zuliebe std::cout << "Bitte Nachnamen eingeben: "; std::getline(std::cin, nachname); firstToupperOtherTolower(nachname); firstToupperOtherTolower(vorname); std::cout << "Ihr Name ist " << vorname << ' ' << nachname << '\n'; }Eingabe: oNI oNI Ausgabe: Oni Oni
Eingabe: öLÄ öNÜ Ausgabe: ölÄ önÜ
-
http://www.cplusplus.com/reference/std/locale/ctype/tolower/
http://fara.cs.uni-potsdam.de/~kaufmann/?page=GenCppFaqs&faq=stricmp#Answ
-
Michael E. schrieb:
http://www.cplusplus.com/reference/std/locale/ctype/tolower/
http://fara.cs.uni-potsdam.de/~kaufmann/?page=GenCppFaqs&faq=stricmp#AnswErstes Kenn ich (natürlich) schon, zweites hat mit meine
r Fragem Problem nichts zu tun (strings case-insensitive vergleichen!?)
-
Hacker schrieb:
std::getline(std::cin, vorname);///PI zuliebewat
-
314159265358979 schrieb:
Hacker schrieb:
std::getline(std::cin, vorname);///PI zuliebewat
Hattest dich doch letztens mit Werner Salomon gezofft?

-
ney.
-
Hacker schrieb:
Erstes Kenn ich (natürlich) schon,
Warum benutzt du es dann nicht?
zweites hat mit meine
r Fragem Problem nichts zu tun (strings case-insensitive vergleichen!?)
Es würde helfen, wenn du dir das mal durchliest, statt schon vorher zu sagen, dass das nichts mit dem Thema zu tun haben soll. Tipp: Wie könnte man wohl Strings case-insensitiv vergleichen?
-
Tja, bin eben zu schnell. Aber auch so:
Michael E. schrieb:
Wie könnte man wohl Strings case-insensitiv vergleichen?
Die std::transform Methode ist laut (dem bisher sehr zuverlässigem C++-reference) äquivalent zu:
template < class InputIterator, class OutputIterator, class UnaryOperator > OutputIterator transform ( InputIterator first1, InputIterator last1, OutputIterator result, UnaryOperator op ) { while (first1 != last1) *result++ = op(*first1++); // or: *result++=binary_op(*first1++,*first2++); return result; }Was resultiert zu mit Input & OutputIterator = std::basic_string<char>::iterator, UnaryOperator = tolower/toupper:
OutputIterator transform ( std::string::iterator first1, std::string::iterator last1,std::string::iterator result, int(*)(int) op ) { while (first1 != last1) *result++ = tolower(*first1++); return result; }WAs im Endeffekt wieder nur das macht, was die anderen "Versuche" auch fabrizieren. Ohne den globalen locale vorher zu verändern wird sich hier auch nichts verändern.
-
EDIT: Ha! Wirft eine Exception. Ha SepJ!
