ASCII Tabelle anzeigen in C



  • Wutz schrieb:

    int main()
    {
      int i, c;
      for( i=0; c=((i&15)<<4)+(i>>4), i<256; ++i )
        printf("%02x %c%c", c,strchr("\b\t\n\x7\r",c)?' ':c,"\n "[!i+1%16]);
    }
    

    ich will sie noch was zu meinem code fragen.

    int main() {
    
         //Lokale Variablen
         char Zahl;
         char Hex;          
         char Anzahl;
         //Intro
         printf("Das ist die ASCII-Zeichentabelle ohne den Steuerzeichen\n\n");
         Anzahl = 0;
         //Eingabe
    
         //Verarbeitung
    
         //Ausgabe
         for(Hex = 32,Zahl = 31; Hex < 127, Zahl < 127; Hex++, Zahl++)  {
               printf("%X %c \n",Hex,Hex);
    
         }
    

    ich möchte gerne noch die anzeige so machen, dass es 8 kolonnen gibt.
    So z.b.
    * * * * * * * * * * * *
    * * * * * * * * * * * *
    * * * * * * * * * * * *
    * * * * * * * * * * * *
    * * * * * * * * * * * *
    * * * * * * * * * * * *
    * * * * * * * * * * * *
    * * * * * * * * * * * *

    Die Sternchen wären jetzt die ASCII Zeichen und Hex zahlen
    Nun habe ich es mit einem Zähler versucht.

    So, dass er nach jedem eingegebenen Zeichen (Anzahl = Anzahl + 1)
    macht,und bei 12 einen umbruch macht. Es geht jedoch nicht. Ich habe es auch irgendwie versucht, in die FOR-Schleife einzubringen. Aber es hat nicht geklappt, ich weiss es nicht wie.
    Wie könnte ich das machen, also ich bin mir ziemlich sicher das es ein zähler ist, korriegern sie mich, wenns nicht so ist, bitte
    Danke vielmals



  • for(Hex = 32; Hex < 128; Hex++)  {
               printf("%02X %c%c",Hex,Hex,"\n "[!Hex+1%12]);
    
         }
    

    Falls sie es nicht verstanden haben, das letzte %c gibt bei jedem 12. Mal 1 '\n' (Zeilenumbruch) aus, sonst ein Leerzeichen ' ' (als Trenner zur folgenden Ausgabe).

    Vielleicht wird es etwas deutlicher mit:

    for(Hex = 32; Hex < 128; Hex++)  {
               printf("%02X %c%c",Hex,Hex,"\n|"[!Hex+1%12]);
    
         }
    


  • ok danke vielmals
    das problem ist jetzt beseitigt
    danke



  • Wir befinden uns da aber schon im Reich der dreckigen Hacks, zumal mir da einige Klammern zu fehlen scheinen - funktionieren tut es in der Form jedenfalls nicht. Wie wäre es mit

    for(Hex = 32; Hex < 128; Hex++) {
      printf("%02X %c ", Hex, Hex);
      if(Hex % 16 == 15) {
        putchar('\n');
      }
    }
    

    ? Wenn's unbedingt in einer Zeile sein soll, tut's

    for(Hex = 32; Hex < 128; Hex++)  {
        printf("%02X %c%c", Hex, Hex, Hex % 16 == 15 ? '\n' : ' ');
      }
    

    .

    Ich rate dir dringendst, von diesem C-Golf-Zug so schnell wie möglich wieder abzuspringen (bzw. gar nicht erst aufzuspringen). Solchen Code kann niemand warten.



  • seldon schrieb:

    Wir befinden uns da aber schon im Reich der dreckigen Hacks, zumal mir da einige Klammern zu fehlen scheinen - funktionieren tut es in der Form jedenfalls nicht. Wie wäre es mit

    for(Hex = 32; Hex < 128; Hex++) {
      printf("%02X %c ", Hex, Hex);
      if(Hex % 16 == 15) {
        putchar('\n');
      }
    }
    

    ? Wenn's unbedingt in einer Zeile sein soll, tut's

    for(Hex = 32; Hex < 128; Hex++)  {
        printf("%02X %c%c", Hex, Hex, Hex % 16 == 15 ? '\n' : ' ');
      }
    

    .

    Ich rate dir dringendst, von diesem C-Golf-Zug so schnell wie möglich wieder abzuspringen (bzw. gar nicht erst aufzuspringen). Solchen Code kann niemand warten.

    ok, ich habe versucht und geschafft den code dann doch noch nach meiner zu gestalten. er sieht so aus

    for(Hex = 32,Zahl = 31; Hex < 127, Zahl < 127; Hex++, Zahl++)  {
             Anzahl = Anzahl + 1;
             printf("%X %c |",Hex,Hex);
               if (Anzahl == 12){
                 Anzahl = 0;
                 printf("\n");
               }
    

    das ist die für mich am verständlichsten methode, weil ich noch nicht so viele befehle etc. kenne.
    danke trotzdem



  • Hallo, wollte keinen neuen Thread aufmachen, also poste ich ma hier.
    Habe einen drahtlosen Sender und Empfänger.
    Habe einen String mit daten drinne von 0 bis 255. Um diese Zahlen zu übertragen möchte ich diese als ascii Zeichen darstellen, da ich dann nur noch ein Byte für jede Zahl benötige. Jetzt ist es so, alle Zahlen werden in ein String geschrieben. Es ist aber so, dass 0 als \0 interpretiert wird und der String normalerweise hier endet, d.h. ich kriege die Zahl 0 nicht auf dem bildschirm ausgegeben. gibt es einen Weg des zu umgehn?

    Gruß



  • In diesem Fall kannst du nicht mit den strxxx-Funktionen von C arbeitem.
    Du mußt doch wissen wie lang deine Daten sind, also kannst du sie auch ausgeben.

    Welches Zeichen soll den für 0 (10, 13, 27, 0-31, 128) auf dem Bildschirm erscheinen?

    PS: Neuer Thread ist besser, weil dein Problem mit dem des TE nichts zu tun hat



  • Hallo , danke für den TIpp. Habs jetzt gelöst, mehr oder weniger mit

    if(rxbuf[i]=='\0')
    uart_puts("0");

    Gruß



  • So schreibst du eine '0' (als Zahlenwert 48). du willst doch aber 0 haben
    Gibt es kein uart_putc() ?



  • Hi, also wenn ich eine NULL übertragen möchte, convertiere ich diese nach ascii '\0'. Am empfänger soll dieses ascii Zeichen '\0' wieder zu NULL werden.
    So war das gedacht, z.b. wenn ich eine 49 in String schreibe, brauche ich 2bytes, wenn ich es aber nach ascii konvertiere, brauche ich nur eine 1 zu übertragen, welche auch 1byte groß ist.

    Ja, uart_putc hab ich auch.

    Gruß



  • snoopy9134 schrieb:

    if(rxbuf[i]=='\0')
       uart_puts("0");
    

    Das '\0' hat den Zahlenwert 0
    Das "0" hat die Zahlenwerte 48 (die Ziffer 0) und 0 (als Stringende '\0')
    uart_puts sollte alle Zeichen bis zur '\0' übertragen. -> Das '\0' wird nicht übertragen.

    -> Du musst eine Schleife über die Anzahl der Daten machen und jedes Zeichen mit uart_putc übertragen.

    Du musst auch unterscheiden zwischen 1, '1', "1". Das sind alles Unterschiedliche Sachen.

    65, 'A' sind nach ASCII gleichwertig, ist aber etwas anderes als "65".



  • Ach noch was:

    NULL ist noch etwas anderes.
    NULL wird für ungültige Zeiger verwendet, und soll einen Wert haben auf den niemals ein Zeiger zeigen kann.
    Bei deinem Problem ist es aber fehl am Platze.

    #define NULL ((void*)0)
    


  • for (i=0; i<rx_cnt; i++)			// Daten weiterleiten
    {
         if(rxbuf[i]=='\0')
              uart_puts("0");
         else
         {
               sprintf(hallo_string,"%d",rxbuf[i]);//ascii to int
    	   uart_puts(hallo_string);
         }	
    
    }
    

    hier, ich hätte dazu schreiben sollen, dass ich die Anzahl der Daten kenne, d.h. wenn rx_cnt==30, dann sollen alle '\0' die bis zur dreißigsten Stelle vorkommen, als NULL dargestellt werden. Das letzte Zeichen wird dann auch als '\0', Stringende erkannt.

    Gurß



  • Du machst genau das Gegenteil von dem was du beschreibst.

    Du machst aus dem Wert 49 (1 Byte) den String "49" (2Byte)

    snoopy9134 schrieb:

    for (i=0; i<rx_cnt; i++)			// Daten weiterleiten
    {
         if(rxbuf[i]=='\0')    // Hier wird mit dem Wert 0 verglichen
              uart_puts("0");  // Hier wird der Wert 48 übertragen
         else
         {
               sprintf(hallo_string,"%d",rxbuf[i]); // int to ascii  :warning: 
               uart_puts(hallo_string); 
         }	
    
    }
    
    "123\0ABC\0" gibt dann "49505106566670"
                            1 2 3 \A B C \
                                  0      0
    

    Darum:

    for (i=0; i<rx_cnt; i++)			// Daten weiterleiten
    {
    	   uart_putc(rxbuf[i]);
    }
    

    Hast du dir schonmal hallo_string angesehen?


Anmelden zum Antworten