wchar_t* zu int OHNE Funktionsaufruf



  • Hallo,

    ich will einen wchar_t* ohne Aufruf weiterer Funktionen zu int konvertieren. Wie mache ich das? Ich habe aber nicht mal Information zur wchar Codierung gefunden. Außerdem kann ich einen wchar_t* nicht mal richtig ausgeben, brauche ich da vielleicht irgendwelche includes?

    Vielen Dank für Eure Hilfe im voraus.



  • Bespiel:

    wchar_t* wcharstring = L"Hallo";

    Was erwartest du jetzt für eine Zahl als Ausgabe?



  • Natürlich nur für Ziffernstrings a la L"293". 🙂
    Sorry, hab vergessen, das zu erwähnen.



  • Wieso denn ohne Aufruf weiterer Funktionen? Der Sinn von Unicode ist es doch, sämtliche Schriftzeichen zu ermöglichen, inklusive verschiedener Zahlendarstellungen.



  • Es müsste doch eigentlich genauso gehen wie bei char. Das 2. Byte ist bei Ziffern glaub ich immer 0.



  • Bei Zeichen aus Latin-1 ist es ohnehin einfach.

    wchar_t* wString = L"123";
    char c = (char)*wString; // c ist nun '1'

    Für die meisten Zeichen (x) aus Latin-1 gilt, dass 'x' == (char)L'x'.



  • Neku schrieb:

    Für die meisten Zeichen (x) aus Latin-1 gilt, dass 'x' == (char)L'x'.

    dann also sowas etwa:

    unsigned int wcs_toint (wchar_t *w)
    {
       unsigned int r = 0;
    
       while (*w)
       {
          r = r * 10;
          r = r + *w++ - '0';
       }
       return r; 
    }
    


  • unsigned int wcs_toint (const wchar_t *w) // const
    {
       unsigned int r = 0;
    
       while (*w >= L'0' && *w < L'9')
       {
          r *= 10;
          r += *w++ - L'0';
       }
    
       return r; 
    }
    


  • Danke. Funktioniert. Aber nur nochmal zum Verständnis, man will ja auch was lernen: - L'0' wird gemacht weil... das zweite Byte 0 ist?



  • Nerd32 schrieb:

    Danke. Funktioniert. Aber nur nochmal zum Verständnis, man will ja auch was lernen: - L'0' wird gemacht weil... das zweite Byte 0 ist?

    "- L'0'" zieht den Unicode-Wert des Unicode-Zeichens '0' ab. "*w" ist ja bei dir nicht zwischen 0 und 9, sondern zwischen L'0' und L'9'.

    *edit*

    unsigned int wcs_toint (const wchar_t *w)
    {
       unsigned int r = 0;
    
       while (*w >= L'0' && *w <= L'9') // "=" vergessen
       {
          r *= 10;
          r += *w++ - L'0';
       }
    
       return r; 
    }
    


  • Es muß while(*w >= L'0' && *w <= L'9') heißen. Es funzt aber nicht mit führenden Nullen, was aber kein Problem sein sollte.



  • Nerd32 schrieb:

    Es funzt aber nicht mit führenden Nullen...

    dann nimm den 😉

    int wcs_toint (const wchar_t *w) 
    {
       int r = 0;
       int f = 0;
    
       if (*w == '-')
       {
          f = 1;
          w++;
       }
    
       while (*w >= '0' && *w < '9')
          r = 10 * r + *w++ - '0';
    
       return f ? -r : r;
    }
    


  • Nerd32 schrieb:

    Es muß while(*w >= L'0' && *w <= L'9') heißen. Es funzt aber nicht mit führenden Nullen, was aber kein Problem sein sollte.

    Den Fehler in der Bedingung hatte ich ja bereits korrigiert 😉 Die funktion sollte aber problemlos mit führenden Nullen funktionieren, wo ist denn dein Problem? Oder möchtest du, dass eine führende 0 ignoriert oder als Anfang einer Zahl in Oktalschreibweise intepretiert wird?

    @net: Dein Code hat nichts mit führenden Nullen zu tun ⚠
    Und kopier bitte nicht meine Fehler 🙂



  • Neku schrieb:

    Und kopier bitte nicht meine Fehler 🙂

    hab' ich doch nicht. die überflüssigen 'L's sind alle weg 😉



  • net schrieb:

    Neku schrieb:

    Und kopier bitte nicht meine Fehler 🙂

    hab' ich doch nicht. die überflüssigen 'L's sind alle weg 😉

    Du hast aber auch "< '9'" statt "<= '9'". Kann aber auch Zufall sein 😉



  • Neku schrieb:

    Du hast aber auch "< '9'" statt "<= '9'". Kann aber auch Zufall sein 😉

    nö, ich hab' einfach deinen code kopiert :p
    ...und natürlich nicht ausprobiert. wahrscheinlich laufen die meisten codes nicht, die ich poste, weil ich die fast nie ausprobiere 😞
    aber der fragesteller soll ja auch noch was zu tun haben 😉



  • Neku schrieb:

    Den Fehler in der Bedingung hatte ich ja bereits korrigiert 😉 Die funktion sollte aber problemlos mit führenden Nullen funktionieren, wo ist denn dein Problem? Oder möchtest du, dass eine führende 0 ignoriert oder als Anfang einer Zahl in Oktalschreibweise intepretiert wird?

    Ist schon in Ordnung, da ja ein int mit führenden Nullen keinen Sinn macht. 🙂



  • Nerd32 schrieb:

    Neku schrieb:

    Den Fehler in der Bedingung hatte ich ja bereits korrigiert 😉 Die funktion sollte aber problemlos mit führenden Nullen funktionieren, wo ist denn dein Problem? Oder möchtest du, dass eine führende 0 ignoriert oder als Anfang einer Zahl in Oktalschreibweise intepretiert wird?

    Ist schon in Ordnung, da ja ein int mit führenden Nullen keinen Sinn macht. 🙂

    Im Moment werden führende Nullen aber zugelassen 😉


Log in to reply