iswdigit gibt für Potenzen einen Wert ungleich 0 zurück



  • Hallo zusammen,

    zur Einordnung: Uns ist aufgefallen, dass es in unserer Anwendung möglich ist Potenzen in Textfelder einzugeben, in denen eigentlich nur Zahlen erlaubt sind. Problematischer Weise werden die dann falsch dargestellt, nämlich in ihrer Integer Repräsentation minus 42.

    Beim debuggen ist mir aufgefallen, dass iswdiget für ² einen Wert ungleich 0 zurück gibt (VS2015)

    #include <iostream>
    #include <string>
    #include <wchar.h>
    #include <wctype.h>
    int main()
    {
      std::wstring in{ L"2²2" };
      std::wcout << in << "\n";
    
      for (auto c : in)
      {
        std::cout << iswdigit(c) << "\n";
      }
    }
    

    Ist das so geplant? Laut Dokumentation sollten doch eigentlich nur "normale" Ziffern von 0-9 einen Wert ungleich 0 liefern.

    Edit:
    Hm, jetzt bekomme ich das gewünschte Ergebnis... ich muss dem wohl noch weiter auf den Grund gehen.

    Edit2: mit "isdigit" bekomme ich das gwünschte Ergebnis. Ich muss gestehen, dass ich das akut trotzdem nicht verstehe.



  • Wide character classification functions (§7.30.2.1/2):

    Each of the following functions returns true for each wide character that corresponds (as if by a call to the wctob function) to a single-byte character for which the corresponding character classification function from 7.4.1 returns true, [...]

    Du solltest also vorher vielleicht mit wctob() testen, ob es überhaupt ein ein-byte character ist?



  • std::wstring in{ L"2²2" };
    std::wcout << in << "\n";
    for (auto c : in)
    {
      if(wctob(c)!= EOF)
        std::cout << iswdigit(c) << "\n";
    }
    

    Da ² ein ein-Byte Character (178) ist, führt das zum selben Ergebnis.


Anmelden zum Antworten