String-Konstante mit ASCII < 32



  • Ich will das ASCII-Zeichen #3 in eine String-Konstante integrieren.
    Wie geht dies ?

    Dies gibt leider nur einen Syntax-Error.

    String text2 = { 3, " Hello World ", 3 };
    char text[] = { 3, " Hello World ", 3 };
    

    Unter Turbo-Pascal würde dies so aussehen:

    var
      text: string = #3 + ' Hello World ' + #3;
    


  • Mathuas schrieb:

    Ich will das ASCII-Zeichen #3 in eine String-Konstante integrieren.
    Wie geht dies ?

    Dies gibt leider nur einen Syntax-Error.

    String text2 = { 3, " Hello World ", 3 };
    char text[] = { 3, " Hello World ", 3 };
    

    Unter Turbo-Pascal würde dies so aussehen:

    var
      text: string = #3 + ' Hello World ' + #3;
    

    so z.b.

    char text[] = "\3 Hello World \3";
    

    aber achtung, die zahlen sind in oktal


  • Mod

    "\3 Hello World \3"
    

    edit: Zu langsam. Zu viel Zeit damit verschwendet, auch noch alle anderen Möglichkeiten zu beschreiben, bloß um alles zu verwerfen, als ich sah, dass das vermutlich eher Verwirrung stiftet 🙂



  • Danke, dies funktioniert jetzt so, das "Hello World" hat jetzt links und rechts ein Herz.

    String text = "\3 Hello World \3"
    

    aber achtung, die zahlen sind in oktal

    Das habe ich gerade gemerkt.
    Die Zeichen 1-7 gehen mit dem "\".
    Für das Zeichen 8 (Rechteck mit weissem Punkt), muss ich anscheinend eine "10" schreiben, für 9 eine 11 usw. ?



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



  • 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