char in ascii
-
In welcher Form willst du denn den Wert speichern? Ein einzelnes Zeichen (in Form einer char-Variable) kannst du einfach zuweisen, als Parameter übergeben und irgendwo im Speicher liegenlassen (du kannst sogar damit rechnen, wenn du Lust hast).
Das von dir erwähnte strcat() wird verwendet bei der Arbeit mit Strings (Zeichenketten, verwaltet als nullterminierte char-Arrays), um den Inhalt zweier Strings zu verketten (d.h. aus "Hallo, " und "Welt" machst du damit "Hallo, Welt").
-
der ASCII besteht ja bekanntlich aus 256 zeichen, wobei jeder ein Dezimaler, dualer und Sedezimaler wert zugewiesen ist. Diese werte will ich nicht ausgeben sondern in ein Char-array speichern und denne z.B. die Zahlen ausgeben. ergo an Stelle von Hello world "48 65 6c 6c 6f 2c 20 57 6f 72 6c 64 0a" bzw "72, 101, 108, 108, 111, 44, 32, 87, 111, 114, 108, 100, 0"
die ausganbe soll allerdings nur als Kontrolle laufen, da diese im späteren verlauf in eine *.so nicht zu sehen sein dürfen.
-
maik81ftl schrieb:
der ASCII besteht ja bekanntlich aus 256 zeichen, wobei jeder ein Dezimaler, dualer und Sedezimaler wert zugewiesen ist. Diese werte will ich nicht ausgeben sondern in ein Char-array speichern und denne z.B. die Zahlen ausgeben. ergo an Stelle von Hello world "48 65 6c 6c 6f 2c 20 57 6f 72 6c 64 0a" bzw "72, 101, 108, 108, 111, 44, 32, 87, 111, 114, 108, 100, 0"
Da würde ich eine Schleife verwenden und die einzelnen Elemente per printf() (als %x bzw %d) ausgeben.
die ausganbe soll allerdings nur als Kontrolle laufen, da diese im späteren verlauf in eine *.so nicht zu sehen sein dürfen.
Wenn du einen Text ausgeben willst, muß er auch irgendwo herkommen - das kann natürlich ein String-Literal sein, aber es klappt genauso gut mit Nutzer-Eingaben (z.B. von scanf() oder fgets()) oder dem Inhalt von Dateien, die du irgendwo auf deiner Festplatte abgelegt hast.
-
supertux schrieb:
Der Datentype char ist im Prinzip ein unsigned int (auf 8 Bits beschränkt), d.h. der char entspricht bereits dem ASCII Code
Also wenn überhaupt, dann int und nicht unsigned int.
-
maik81ftl schrieb:
der ASCII besteht ja bekanntlich aus 256 zeichen, wobei jeder ein Dezimaler, dualer und Sedezimaler wert zugewiesen ist. Diese werte will ich nicht ausgeben sondern in ein Char-array speichern und denne z.B. die Zahlen ausgeben. ergo an Stelle von Hello world "48 65 6c 6c 6f 2c 20 57 6f 72 6c 64 0a" bzw "72, 101, 108, 108, 111, 44, 32, 87, 111, 114, 108, 100, 0"
die ausganbe soll allerdings nur als Kontrolle laufen, da diese im späteren verlauf in eine *.so nicht zu sehen sein dürfen.
Schwachfug.
ASCII wird nicht irgendwas zugewiesen. Zahlenwerte können verschieden interpretiert werden, z.B. dual,dezimal,hexadezimal,Zeichen,...
Original ASCII (und darum ging es in der Ausgangsfrage) definiert 128 Zeichen.
Diese haben als Zahlenwert interpretiert die Werte 0...127.
Extended ASCII (spätere Quasi-Definition) definiert auch 128 Zeichen, deren interpretierter Dezimalwert den Wertebereich 128...255 hat.
Hier hinein "definieren" unterschiedliche Leute/Quasistandards auf der ganzen Welt ihre persönlichen Wünsche, Deutsche z.B. meinen, hier die deutsche Umlaute an feste Stellen platzieren zu können, Chinesen sind da z.B. u.U. kollidierender Meinung.Für die standardkonforme Abfrage nach Zeichen aus dem 7 Bit Original-ASCII gibt es diverse Funktionen, isalpha,isalnum,isdigit,... aus ctype.h bzw. mit Hilfe von setlocale greifen diese Funktionen implizit auch auf Extended ASCII (8-Bit) zu, wobei die Betonung auf implizit liegt und eigenes Rumgefummel hier meist falsch ist.
-
[@Wutz
Davon rede ich ich doch. Bsp: der Buchstabe "z" hat den Dezimalen wert 90, den Binärwert 01011010 und Sedezimal den wert 5A. klar recht habt ihr! eigendlich nur 128 zeichen. Das streite ich auch nicht ab. nur alle, welche umlaute wie Ä, Ö, Ü, und co könne es nun mal nicht ab, wenn diese mit ae, oe, ue geschrieben werden. geschweige bei ß mit Doppelt "s".
will ehrlich gesagt nicht wissen, was sich die Programmierer bei Buchstaben wie è à ò und ähnlich haben einfallen lassen.
aber das Spielt ja auch leine rolle.
Gennerell will ich nur Zahlenwert eines Zeichens haben, ggf. durch 'ne math function verändern und denne den zahlenwert in Form eines Stringes übergeben.
am Bsp von "z" = 01011010 --> um x stellen nach links/rechts Rotieren = 10110100/00101101 Ergebnis als String "10110100/00101101" dies jedoch NICHT über die printf sondern als Rüchgabewert einer function.
Bedingung soll bleiben Alle Parameter müßen vom Typ
char
bleiben
in fpc würde ich dies z.B. wie folgt schreiben
function DeztoBin(aint:integer):pChar; {$IFDEF WINDIWS}stdcall{$ELSE}cdecl{$ENDIF}; var B: Byte; puffer: integer; a: String; begin a:= ''; puffer := aint; // puffer übernimmt aInt for B:= 7 downto 0 do begin if puffer mod 2 = 0 then // ist puffer / 2 = x rest "0" begin Puffer:= puffer div 2; a:= '0'+a; // ja dann bekommt eine 0 vorne ran end else begin puffer:= Puffer div 2; a:='1'+a; // Nein dann eine 1 vorne ran end; end; A:= '|'+A; // Zeichenabschluß für rückwandlung result:= pChar(A); end; Function StrtoBin(Value: pChar; int: Byte):pChar; {$IFDEF WINDIWS}stdcall{$ELSE}cdecl{$ENDIF}; var Count: Integer; Buchstabe: Integer; Temp: String; begin Temp:= ''; Count:= Length(Value); for Buchstabe:= 0 to Count do Temp:= Temp+DeztoBin(ord(Value[Buchstabe])); end; result:= PChar(Temp); end;
und da weiß ich bekommen auch auf meinem Buchstaben ohne großen aufwand den Binärwert als pChar überliefert.
Falls ihr nun fragt, warum ich das nicht gleich in fpc machen, nun die Antwort liegt auf der hand. .so via fpc(Lazarus) ca 1,5 MB .so via c/c++ ca 10KB
Nachtrag!
Begründet durch die Tatsache, das ich auch umlaute und Sonderzeichen zulasse, muß ich auch ein unsigned char zurüchkreifen.
-
Sowas wie ord() gibt es in C nicht. Brauchst du auch nicht denn in einem char steht eh eine Zahl drin.
Somit kannst du damit auch ganz normal rechnen.
+ - * / % << >> | & ~ ^ ! (was habe ich jetzt noch vergessen ?)Den Umweg über einen "Dualzahlenstring" brauchst du nicht.
-
DirkB schrieb:
Sowas wie ord() gibt es in C nicht. Brauchst du auch nicht denn in einem char steht eh eine Zahl drin.
OK! nun hast du's geschaft...
wenn ich das nun Hoffendlich richtig begreife char ein zeichen, in dem eine Zahl drin steht. aber den Zahlen wert erhalte ich nur mit
int(char)
.
auch wenn in dem Buch C-Programmierung lernen | ISBN: 3827314054 alles soweit sauber erklärt wurde, vermist ich so einiges.
und das es ähnliche Funktionen wie ord() nicht gibt, ob damit hab ich mich schon abgefunden. und was deine Operationen angeht. nun da ist in meinem Buch auch nur die häflte erklärt und ausgeschlüßelt
-
Da es immer mal wieder Verständnisschwierigkeiten gibt, wie man in C Zahlenwerte als String benutzt, hier mal eine kleine Übersicht (strikt C89 konform, wenn auch nicht multithreadfähig)
#include <stdio.h> #include <limits.h> const char* ultostr(unsigned long ul) { static char s[300]=""; char *p=s+298; *p++='0'; while( ul ) *--p='0'+(ul&1),ul>>=1; return *p?p:--p; } int main() { puts(ultostr(INT_MIN)); /* binaer */ printf("\n%d",INT_MIN); /* dezimal */ printf("\n%u",INT_MIN); /* vorzeichenlos dezimal */ printf("\n%x",INT_MIN); /* hexadezimal */ printf("\n%o",INT_MIN); /* oktal */ return 0; }
-
maik81ftl schrieb:
...
wenn ich das nun Hoffendlich richtig begreife char ein zeichen, in dem eine Zahl drin steht. aber den Zahlen wert erhalte ich nur mit
int(char)
.
Nein.
Ein char ist einfach ein Ganzzahltyp wie int auch (der Wertebereich ist kleiner).
Die Annahme das der Wert 65 einem 'A' ist kann man machen (muss man aber nicht).Ein char[] ist ein Array aus char. Damit kann man genauso rechnen wie mit einem int[].
#include <stdio.h> int main() { int i; char s[] = "Hallo Welt!"; printf("String : %s\n", s); printf("Zeichen: "); for(i=0; s[i] != 0;i++) //s[i] ist das Zeichen an der Stelle i { printf("%c", s[i]); // %c heisst als Zeichen ausgeben } printf("\n"); printf("Dezimal: "); for(i=0; s[i] != 0;i++) { printf("%i ", s[i]); // %i heisst als Zahl ausgeben } printf("\n"); printf("HEX : "); for(i=0; s[i] != 0;i++) { printf("%x ", s[i]); } printf("\n"); printf("Invertiert: "); for(i=0; s[i] != 0;i++) { printf("%x ", ~s[i]); // durch ~ wird der Wert Bitweise Invertiert } printf("\n"); printf("Multipliziert: "); for(i=0; s[i] != 0;i++) { printf("%x ", s[i] * 2); } printf("\n"); return 0; }
Operatoren:
+ - * / sollte klar sein
% Modulo, der Rest der ganzzahligen Division (2. Klasse Rrechnen)
<<n >>n Links, Rechts verschieben der Bits um n Stellen
| & ~ ^ Binäres Oder, Und, Nicht, ExklusivOder
! Logisches Nicht
(was habe ich jetzt noch vergessen ?) ich denke nichts.
-
Jopp! so Glas klar erklärt kann man sich das Natürlich merken.
thx.