String-Konstante mit ASCII < 32



  • hustbaer schrieb:

    Du kannst aber auch hexadezimal haben.
    Dann musst du halt "\Xnn" schreiben, mit nn = hexadezimale Zahl.

    Aber Achtung.
    DieHexschreibweise ist gierig und nimmt soviel Hexziffern, wie sie bekommen kann.
    Bei der Oktalschreibweise ist nach maximal 3 Ziffern Schluss.

    Das bekannte '\0' ist auch nichts anderes.



  • hustbaer schrieb:

    Ja, oktal halt.
    Du kannst aber auch hexadezimal haben.
    Dann musst du halt "\Xnn" schreiben, mit nn = hexadezimale Zahl.

    ich glaube es muss nicht zweistelig sein. es geht auch \xd für 13.
    oder liege ich falsch?



  • swapper schrieb:

    hustbaer schrieb:

    Ja, oktal halt.
    Du kannst aber auch hexadezimal haben.
    Dann musst du halt "\Xnn" schreiben, mit nn = hexadezimale Zahl.

    ich glaube es muss nicht zweistelig sein. es geht auch \xd für 13.
    oder liege ich falsch?

    wie willst du denn 13 sonst in hexadezimaler Schreibweise notieren?


  • Mod

    swapper schrieb:

    hustbaer schrieb:

    Ja, oktal halt.
    Du kannst aber auch hexadezimal haben.
    Dann musst du halt "\Xnn" schreiben, mit nn = hexadezimale Zahl.

    ich glaube es muss nicht zweistelig sein. es geht auch \xd für 13.
    oder liege ich falsch?

    Die Sequenz darf beliebig viele hexadezimale Stellen haben. Bei oktaler Schreibweise sind es maximal 3.


  • Mod

    asdfasdasd schrieb:

    swapper schrieb:

    hustbaer schrieb:

    Ja, oktal halt.
    Du kannst aber auch hexadezimal haben.
    Dann musst du halt "\Xnn" schreiben, mit nn = hexadezimale Zahl.

    ich glaube es muss nicht zweistelig sein. es geht auch \xd für 13.
    oder liege ich falsch?

    wie willst du denn 13 sonst in hexadezimaler Schreibweise notieren?

    Man könnte eine führende Null verwenden.



  • camper schrieb:

    swapper schrieb:

    hustbaer schrieb:

    Ja, oktal halt.
    Du kannst aber auch hexadezimal haben.
    Dann musst du halt "\Xnn" schreiben, mit nn = hexadezimale Zahl.

    ich glaube es muss nicht zweistelig sein. es geht auch \xd für 13.
    oder liege ich falsch?

    Die Sequenz darf beliebig viele hexadezimale Stellen haben. Bei oktaler Schreibweise sind es maximal 3.

    gibt es einen grund für diesen unterschied?



  • asdfasdasd schrieb:

    swapper schrieb:

    hustbaer schrieb:

    Ja, oktal halt.
    Du kannst aber auch hexadezimal haben.
    Dann musst du halt "\Xnn" schreiben, mit nn = hexadezimale Zahl.

    ich glaube es muss nicht zweistelig sein. es geht auch \xd für 13.
    oder liege ich falsch?

    wie willst du denn 13 sonst in hexadezimaler Schreibweise notieren?

    als d



  • swapper schrieb:

    gibt es einen grund für diesen unterschied?

    Multibyte Charakter.

    Die ersten C-Compiler kannten nur die okatlen Sequencen, darum hat man daran nichts mehr geändert.



  • Man kann das Problem aber mit Anführungszeichen umgehen.

    "\x48""allo Welt"
    


  • camper schrieb:

    Die Sequenz darf beliebig viele hexadezimale Stellen haben.

    Ui, danke für die Aufklärung! Wusste ich nicht. 😮



  • probiert mal aus.
    ist das bei euch auch so (siehe kommmentare)?

    wchar_t a = L'\1';
        wchar_t b = L'\10';
        wchar_t c = L'\100';
        wchar_t d = L'\1000'; // warning: character constant too long for its type
    
        wchar_t e = L'\x1';
        wchar_t f = L'\x10';
        wchar_t g = L'\x100';
        wchar_t h = L'\x1000';
    
        wchar_t i = L'\x10000'; // warning: hex escape sequence out of range
    
        printf ("%d %d %d %d\n", a, b, c, d); // d == 48, wtf?
        printf ("%d %d %d %d\n", e, f, g, h);
        printf ("%d\n", i); // 0
    


  • swapper schrieb:

    wchar_t d = L'\1000'; // warning: character constant too long for its type
        printf ("%d %d %d %d\n", a, b, c, d); // d == 48, wtf?
    

    Ist doch logisch, warum er das macht: nur das, was nicht überläuft, kommt in d rein, und das ist nun mal das '0'-Zeichen am Ende. '0' == 48 dezimal.

    wchar_t d = L'\1005';
    printf("%x|%d|%c\n",d,d,d);
    

    Gibt aus:

    35|53|5
    

    EDIT: wobei ich das hier auf einer LE-Maschine angeschaut habe. Wäre interessant zu sehen, was der Compiler auf einer BE-Maschine daraus macht.



  • dachschaden schrieb:

    swapper schrieb:

    wchar_t d = L'\1000'; // warning: character constant too long for its type
        printf ("%d %d %d %d\n", a, b, c, d); // d == 48, wtf?
    

    Ist doch logisch, warum er das macht: nur das, was nicht überläuft, kommt in d rein, und das ist nun mal das '0'-Zeichen am Ende. '0' == 48 dezimal.

    alles klar. er bricht das parsen der oktalzahl ab und nimmt das nachfolgezeichen als normalen charakter.



  • swapper schrieb:

    alles klar. er bricht das parsen der oktalzahl ab

    Das habe ich nicht geschrieben.



  • dachschaden schrieb:

    swapper schrieb:

    alles klar. er bricht das parsen der oktalzahl ab

    Das habe ich nicht geschrieben.

    du hast aber den entscheidenden tipp geliefert.

    char a[] = "\1000"; 
        printf ("%d %d %d\n", sizeof(a), a[0], a[1]);
    

    sizeof gibt 3, nämlich 2 zeichen und 0-ende.
    die beiden zeichen sind oktal-100 und '0'
    das erklärt auch das warning von oben 'char constant too long'
    in eine char-variable geht nur 1 char rein, aber '\1000' sind 2 chars.

    bei char a = 'abc'; wird a auf 'c' gesetzt, trotz warning.


Anmelden zum Antworten