char in ascii



  • hi, bin c anfänger und hätt da ne frage:

    wie kann ich einen per fgets eingegebenen char in seinen ascii wert umwandeln?
    es soll überprüft werden ob chars ausserhalb des amerikanischen standarts eingegeben wurden.

    lg,
    hans



  • schasquastn schrieb:

    hi, bin c anfänger und hätt da ne frage:

    wie kann ich einen per fgets eingegebenen char in seinen ascii wert umwandeln?
    es soll überprüft werden ob chars ausserhalb des amerikanischen standarts eingegeben wurden.

    lg,
    hans

    Der Datentype char ist im Prinzip ein unsigned int (auf 8 Bits beschränkt), d.h. der char entspricht bereits dem ASCII Code

    char ascii[] = "Der ASSCI Code";
    int i;
    for(i=0; i < sizeof ascii; ++i)
      printf("%c == %d\n", ascii[i], ascii[i]);
    


  • sry, das ich nach ü 3 Jahren hier noch mal was Frage.

    wie verhält es sich denne, wenn ich den wert nicht ausgeben, sonder in eine "Variable" für weitere Verarbeitung speichern möchte?

    wenn ich das grade richtig vermute doch bestimmt via

    strcat();
    


  • 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.


Anmelden zum Antworten