ASCII Tabelle anzeigen in C
-
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() ?
-
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?