isgraph und Umlaute
-
Hi,
ich hab das hier mal unter der WinXP konsole getestet (Englische XP Version):
#include <iostream> #include <cctype> int main(int argc, char *argv[]) { std::string uml = "ÄÖÜäöüß"; for (unsigned i = 0; i < 6; ++i) { if(std::isgraph( uml[i]) ) { std::cout << i; std::cout.flush(); } } return 0; }
(Hintergrund: Ich will alle "Druckbaren" Zeichen testen, gibt es da ne Alternative?)
Mein Ergebniss ist da 01235 warum? wo ist denn die 4?[Edit]Die 6 könnte ich mir ja erklären aber warum erkennt er alle Umlaute nur das (kleine)'ö' nicht[/Edit]
hängt das mit locale zusammen?
-
[cpp]
#include <stdio.h>int main()
{
for( int i = 0; i < 255; ++i )
printf( "%i: %c\n", i, i );return 0;
}
-
Danke, sehr witzig. Das ist ja noch nicht mal C++ sondern C, und beantwortet trotzdem nicht meine Frage. Ich will ja nicht jedes zeichen selbst testen sonder wollte die Funktion dazu nutzen
Achja und BTW: Registrier dich!
MfG
-
eViLiSSiMo schrieb:
ich hab das hier mal unter der WinXP konsole getestet (Englische XP Version):
#include <iostream> #include <cctype> int main(int argc, char *argv[]) { std::string uml = "ÄÖÜäöüß"; for (unsigned i = 0; i < 6; ++i) { if(std::isgraph( uml[i]) ) { std::cout << i; std::cout.flush(); } } return 0; }
Der Code hat für den Fall char == signed char undefiniertes Verhalten! Wenn du die aus C kommenende isgraph-Funktion verwenden möchtest, musst du das Argument explizit nach unsigned char casten. Mit dem klassischen Lokale solltest du dann keine Ausgabe bekommen.
Jetzt musst du noch ein locale-Objekt installieren, dass die Umlaute korrekt einordnet:// C++ #include <locale> #include <iostream> int main(int argc, char *argv[]) { // Achtung: Der Language-String ist nicht standardisiert // Deine Compiler-Doku gibt Auskunft darüber, was der richtige // Name für deinen Fall ist locale c("german"); std::string uml = "ÄÖÜäöüß"; for (unsigned i = 0; i < 6; ++i) { if(std::isgraph(uml[i], c) ) { std::cout << i; std::cout.flush(); } } return 0; } // mit den C-Funktionen #include <iostream> #include <clocale> #include <cctype> int main(int argc, char *argv[]) { setlocale(LC_CTYPE, "german"); std::string uml = "ÄÖÜäöüß"; for (unsigned i = 0; i < 6; ++i) { if(std::isgraph(static_cast<unsigned char>(uml[i]) )) { std::cout << i; std::cout.flush(); } } return 0; }