CharLower



  • Keine Ahnung obs richtig ist:

    char convertToLower(char input)
    {
    	return reinterpret_cast<char>(CharLower(reinterpret_cast<LPTSTR>(input)));
    }
    


  • ...



  • char szString[] = "GROSSESWORT";
    char c = szString[5];
    CharLower( &c );
    szString[5] = c;
    

    oder in diesem Fall

    char szString[] = "GROSSESWORT";
    szString[5] += 32;
    

    😃



  • @Airdamn: genau so nicht

    Die Funktion erwartet entweder einen Pointer auf einen Nullterminierten String, oder ein einzelnes Zeichen, das in einen Pointer gecastet wird. Also:

    char c = 'A';
    char* sz = reinterpret_cast<char*>( c); // sz ist immer noch 65 (== 'A')
    

    In diesem Fall ist das "high word" 0 und die Funktion glaubt, dass es kein Pointer ist und konvertiert nur das eine Zeichen. D.h. Pointer < 65535 lassen sich mit dieser Funktion nicht konvertieren.

    Meiner Meinung nach ist das ein tolles Beispiel für abartige Programmierung (in diesem Fall MS).

    BTW, was spricht eigentlich gegen tolower ?



  • Hi,

    mir geht's eigentlich um die Umlaute. ÄöÜ lassen sich nicht so einfach low-ern.

    tolower ist abhängig von den locale - Setting. Default Wert ist hier C.

    A value of C specifies the minimal ANSI conforming environment for C translation.

    char c = 'Ä';
    int i = tolower((int) c);
    char d = (char) i;
    // Geht nicht! Nur wenn ich vorher die locale - Settings auf "deu" ändere
    
    char * locale;
    locale = setlocale( LC_ALL,  "deu");
    

    CharLower ist eine API - Funktion und berücksichtigt die System - Einstellungen.

    So wie's aussieht gehe ich von CharLower weg und benutze dann doch tolower.
    Muss mich aber mit den locale - Settings ordentlich auseinandersetzen.



  • niemand schrieb:

    @Airdamn: genau so nicht
    ...

    Warum nicht?
    HIWORD( c ) ist 0 und LOWORD( c ) ist das zu konvertierende Zeichen!

    Hast Du schon die Funktion CharLower mit Deiner Lösung benutzt ?



  • Airdamn in deinem Beispiel übergibst du einen Zeiger auf den Buchstaben. Es muss aber der Buchstabe selbst übergeben werden.



  • CharLower erwartet einen Zeiger auf einen Null-terminierten String oder einen Zeiger auf einen Char!

    MSDN schrieb:

    [in, out] Pointer to a null-terminated string or specifies a single character. If the high-order word of this parameter is zero, the low-order word must contain a single character to be converted.

    Und das mein Beispiel funzt ist zufall?



  • CharLower erwartet einen Zeiger auf einen Null-terminierten String oder einen Zeiger auf einen Char!

    Falsch:

    Pointer to a null-terminated string or specifies a single character.

    Specifiest meint nicht, dass es sich dabei um einen Zeiger auf ein einzelnes Character handet.
    Bei einem Zeiger ist das Highword typischerweise nicht 0.
    BTW, bei mir funktioniert Dein Beispiel nicht... Ob es funktioniert hängt davon ab, ob hinter dem char c eine 0 auf dem Stack liegt. Dann sieht es so aus, wie ein null-terminierter String und es geht zufällig. Der OP hatte aber ebenfalls genau einen Fehler an der Stelle bekommen (erstes Post).

    Überleg Dir mal, wie Du die Funktion CharLower selber implementieren würdest. Wie erkennst Du denn, dass der Pointer den Dir jemand übergibt nur ein Zeichen enthält oder einen String.

    @OP, ich hätte erwartet, dass MSVC die locale auf die Ländereinstellung von Windows setzt (und das tolower letztendlich CharLower aufruft, habe ich aber nicht nachgeschaut, sorry)



  • Ok, dann muss man bei einem einzelnen char scheinbar den Rückgabewert verarbeiten, denn der übergebene bleibt unverändert:

    char c = 'A';
    char* p = reinterpret_cast<char*>( c );
    char* r = CharLower( p );
    cout << (char)p << endl;    // 'A'
    cout << (char)r << endl;    // 'a'
    


  • richtig! 👍 🤡


Anmelden zum Antworten