ASCII Tabelle anzeigen in C



  • Guten Tag
    Ich bin frisch gewordener Informatikerlehrling.
    Also seit ca. 2 Monaten. Nun haben wir eine Aufgabe bekommen.
    Und zwar:
    Wir sollen ein Programm schreiben, dass die ASCII Tabelle im Konsolenfenster anzeigt. Die ersten 31 werden ausgelassen. Die Zeichen sollen mit ihrer jeweiligen Hexadezimalzahl angezeigt werden. Ich will Ihnen zeigen wie weit ich schon gekommen bin, und woran ich gerade verzweifle:

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

    ich weiss, für viele von euch ist das ein leichtes programm, für mich als anfänger nicht wirklich. wie auch immer.

    Starte ich dieses programm, zeigt es mir "Zahl" und "Hex" nicht so nebeneinander an, sondern "Hex" und "Zahl". Dazu kommt, dass zwar die letzte Hexadezimale Zahl gezeigt wird, jedoch das zeichen dazu nicht.

    und ich bin wirklich schon lange dran, also es ist nicht so das ich nichts versucht habe.
    Könnt ihr helfen
    Danke vielmals
    grüsse

    EDIT
    Tschuldige, ich wollte nicht unhöflich wirken.

    - wie dein Wissensstand aussieht (welche Teile der Sprache kannst du und welche nicht, was verstehst du und was nicht)
    *Wie schon gesagt, seit etwa 2 Monaten am C lernen(es ist spannend!)

    - was du ueberhaupt erreichen willst
    *Eben, das Programm fertig schreiben. Also die ASCII Tabelle mit HEX Zahlen.

    - was du schon versucht hast, um das Problem zu beheben...
    *Ich habe schon gegoogelt was das zeug hält,und ich verstehe alles was im code steht, nur eben nicht, wieso "Hex" und "Zahl" verkehrt gezeigt werden.

    - ...und was davon wie ausgegangen ist
    *alles ging gut aus, bis auf des letzte, das mit der reihenfolge. ich weis wirklich nicht wie das formulieren. habe einiges versucht.

    - welche anderen Quellen du nach hilfreichen Informationen abgesucht hast...
    *Wikibooks,andere C Foren
    - ...was du gefunden hast und...
    *das "%x" (int) in Hex umwandelt, also umgewandelt anzeigt

    - ...warum du das gefunden hast, was du gefunden hast ("ich finde nichts bei google" ist daemlich)
    * weil google einer der besten freunde ist, die man haben kann.

    Ich habe gepostet bevor ich überhaupt diesen "warum niemand meine threads.." thread gelesen habe.

    also noch einmal
    ich bitte um eure hilfe
    Und danke euch auch wenn ich keine kriege 🙂



  • Ist

    printf("%x %c\n", Hex, Zahl);
    

    gemeint?



  • // durch das '\n' springst du in die nächste Zeile, und dies zwischen der Ausgabe von den beiden Werten
    // printf("%c\n %x",Zahl,Hex);
    // besser so
    printf("%X %c\n",Hex,Hex);
    oder so
    printf("%X %c\t",Hex,Hex);
    

    Zahl brauchst du gar nicht, durch %c und %d wird das schon richtig interpretiert.



  • seldon schrieb:

    Ist

    printf("%x %c\n", Hex, Zahl);
    

    gemeint?

    ja genau.



  • Also ich habe noch gemerkt, dass meine ASCII Tabelle verschoben war. Habe es irgendwie hingekriegt.

    int main() {
    
         //Lokale Variablen
         char Zahl;
         int Hex;          
         char Anzahl;
         //Intro
         printf("Das ist die ASCII-Zeichentabelle ohne den Steuerzeichen\n\n");
    
         //Eingabe
    
         //Verarbeitung
    
         //Ausgabe
         for(Hex = 32,Zahl = 31; Hex < 127, Zahl < 127; Hex++, Zahl++)  {
             printf("%c \n%x",Zahl,Hex);
    
         }
    
         system ("PAUSE"); /* Nur während der Entwicklungsphase, später löschen!*/
         return (0);
    }
    


  • Vicious Falcon schrieb:

    // durch das '\n' springst du in die nächste Zeile, und dies zwischen der Ausgabe von den beiden Werten
    // printf("%c\n %x",Zahl,Hex);
    // besser so
    printf("%X %c\n",Hex,Hex);
    oder so
    printf("%X %c\t",Hex,Hex);
    

    Zahl brauchst du gar nicht, durch %c und %d wird das schon richtig interpretiert.

    ich habs gemacht, und WOW!
    also, es wirkt.
    aber heisst das dann auch, dass die variable "Zahl" überflüssig ist?



  • #include <stdio.h>
    #include <ctype.h>
    
    int main()
    {
      int _=0xff+1;
      while(_--)
        if(isprint(_))
          printf("%#2x %c\n",_,_);
      return 0;
    }
    


  • 😑 schrieb:

    #include <stdio.h>
    #include <ctype.h>
    
    int main()
    {
      int _=0xff+1;
      while(_--)
        if(isprint(_))
          printf("%#2x %c\n",_,_);
      return 0;
    }
    

    der code funktioniert irgenwie nicht ..^^'



  • Aha!



  • Mit int Hex bist du auf jeden Fall auf der sicheren Seite. Deklarier doch mal Hex als char und probier aus, bis 255 hochzugehen...



  • 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]);
    }
    


  • KISS



  • 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() ?


Anmelden zum Antworten