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;
    }



  • @Airdamn

    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; 
    }
    

Log in to reply