htoi() - hex- zu dez-Werten wandeln



  • Wobei meine Lösung nicht ganz zu deinem Code passt, da du im String von der Stelle mit der geringsten Wertigkeit zu der mit der höchsten Wertigkeit gehst. Mein Vorschlag funktioniert aber nur, wenn das genau andersrum wäre. Willst du diese Reihenfolge beibehalten, sind kleine Anpassungen notwendig. Dann müssen die einzelnen Berechnungen ungefähr so aussehen

    dez += (s[i] - '0') * j;
    

    j ist weiterhin deine Laufvariable, die vor der Schleife mit 1 initialisiert wird und in der Schleife entsprechend berechnet wird

    j *= 16;
    


  • /bin/bash0R schrieb:

    @AJ

    Alter Schwede, das is ne Lösung! Danke dafür. Ich arbeite gerade die Aufgaben von Kernighan und Ritchie(Programmieren in C) durch. Die htoi() Funktion wird in Aufgabe 2 - 3 gefordert. Bis zu diesem Punkt hat man die sscanf() Funktion noch nicht gelernt, und deshalb hatte ich von Lösungen in deine Richtung abgesehen. Ich wollt es halt 'zur Fuss' machen.

    Danke nochmal!

    Euer bash0R

    Ich arbeite auch das Buch durch.... vielleicht kann man sich ja gegenseitig helfen, damit wir das Buch durchpacken !



  • Ich bekomme da falsche Werte angezeigt, wenn ich das Programm benutzte..

    Ox222 = 2 kommt zum Beispiel auch mal vor und ich hab nachgeprüft, dass dies nicht die richtige umgewandelte Dezimalzahl ist !



  • Dann zeig doch mal deinen Code.

    cHillb3rT schrieb:

    Ox222

    ist übrigens kein hex Literal.



  • #define YES 1
    #define NO 0

    /* htoi: hexadezimal TExt in int verwandeln */

    int htoi(char s[])
    {
    int hexdigit, i, inhex, n;

    i = 0;
    if (s[i] == '\0');
    {
    ++i;
    if(s[i] == 'x' || s[i] == 'X')
    ++i;
    }
    n = 0;
    inhex = YES;
    for ( ; inhex = YES; ++i)
    {
    if (s[i] >= '0' && s[i] <= '9')
    hexdigit = s[i] - '0';
    else if (s[i] >= 'a' && s[i] <= 'f')
    hexdigit = s[i] - 'a' + 10;
    else if (s[i] >= 'A'&& s[i] <= 'F')
    hexdigit = s[i] - 'A' + 10;
    else
    inhex = NO; /* keine gültige Hex-Ziffer */
    if (inhex == YES)
    n = 16 * n + hexdigit;
    }
    }

    @ Groove: Ne ich habs gelöst, aber ich hab hier noch eine andere Variante zum Lösen gefunden !



  • @chillbert
    Bitte CPP (C/C++) Tags verwenden.



  • @cHillb3rT

    Hi,

    hab nix dagegen, wenn wir die Programme aus K&R gemeinsam bearbeiten.
    Welche Aufgaben hast du schon?
    Ich hab
    2-2
    2-3
    2-4
    2-5

    Mehr leider noch nicht, aber ich arbeite dran.
    Bin jetzt bei den Bitoperationen, die bereiten mir allerdings so manches Kopfzerbrechen. Ich versuch sie aber zunächstmal, alleine zu lösen. Falls ich scheitern sollte, sag ich dir bescheid.

    Cya



  • cHillb3rT schrieb:

    if (s[i] == '\0'); 
    { 
    ++i; 
    if(s[i] == 'x' || s[i] == 'X') 
    ++i; 
    }
    

    Das kann so nicht funktionieren. Erstens ist '\0' nicht das Zeichen für die Ziffer 0, sondern das Null-Zeichen. Also das, was C-Strings als Endekennung verwenden. Zweitens funktioniert die if-Abfrage nicht so wie gedacht, da das Semikolon am Ende der if-Bedingung keine weiteren Aktionen folgen lässt. Danach wird einfach Code unbedingt in einem neuen Gültigkeitsbereich ausgeführt.

    btw:

    cHillb3rT schrieb:

    #define YES 1 
    #define NO 0
    

    Schon mal was von bool gehört?



  • AJ schrieb:

    @chillbert
    Bitte CPP (C/C++) Tags verwenden.

    Was meinst du damit genau ?



  • /bin/bash0R schrieb:

    @cHillb3rT

    Hi,

    hab nix dagegen, wenn wir die Programme aus K&R gemeinsam bearbeiten.
    Welche Aufgaben hast du schon?
    Ich hab
    2-2
    2-3
    2-4
    2-5

    Mehr leider noch nicht, aber ich arbeite dran.
    Bin jetzt bei den Bitoperationen, die bereiten mir allerdings so manches Kopfzerbrechen. Ich versuch sie aber zunächstmal, alleine zu lösen. Falls ich scheitern sollte, sag ich dir bescheid.

    Cya

    Ich bin eben dabei Kapitel 1 zu machen a1 - 20 hab ich schon durch und ich hab auch einige Programme schon aus dem 2. und 3. Kapitel, die ich jetzt nochmal genau durchgehe !



  • Windalf schrieb:

    spontan fällt mir nicht viel kürzeres ein vielleicht wenn interpreter mitpsielen sollte 😃

    Da kann ich nicht widerstehen 😃

    Meine Version:

    int h(char*c){int i,j=0;for(;*c;){i=*c++-48;9<i?i-=7:i;j<<=4;j|=i&15;}return j;}
    

    79 Zeichen. 15 Zeichen kürzer als deine. 😃



  • Hallo,

    groovemaster2002 schrieb:

    btw:

    cHillb3rT schrieb:

    #define YES 1 
    #define NO 0
    

    Schon mal was von bool gehört?

    schon mal daran gedacht, daß es hier um "K & R - C" geht, da gibt es keinen bool-Datentyp, dagegen wird YES/NO dort wohl oft benutzt (man sollte sich in der Lernphase auch mit den #define's auseinandersetzen, das wird man noch häufig genug in C-Code finden). Und selbst wenn, müßte dafür ein/eine geeignete(r) Compiler/Umgebung vorhanden sein, und welcher Compiler eingesetzt wird, wurde bisher noch nicht erwähnt (oder habe ich das übersehen?) 😉

    oder war deine Anmerkung ganz anders zu verstehen?

    MfG



  • cHillb3rT schrieb:

    AJ schrieb:

    @chillbert
    Bitte CPP (C/C++) Tags verwenden.

    Was meinst du damit genau ?

    Unterhalb dem Textfeld, in dem du deine Postings schreibst, ist erstmal eine Leiste mit Smilies und darunter befinden sich ein paar Leisten, mit denen man Tags einfügen kann. Gleich die erste ist der C/C++ Tag. Wenn du auf den Button klickst (es erscheint [ cpp], dann deinen Quellcode einfügst (aber bitte nur Quellcode; Kommentare eingeschlossen) und dann nochmal draufklickst (es erschein [ /cpp]), dann wird dein Quellcode wunderbar formatiert und leserlich dargestellt (außer er wäre von Haus aus schlecht gestaltet).



  • ah vielen Dank.... das hab ich net so gewusst 😉

    Dann werde ich das nun in Zukunft dann tun, damit ihr auch alle gut meine Threads lesen könnt.



  • Probe-Nutzer schrieb:

    schon mal daran gedacht, daß es hier um "K & R - C" geht

    Also bei mir zeigt der Forumtitel, dass es um ANSI C (bzw. ISO C) geht.

    Probe-Nutzer schrieb:

    da gibt es keinen bool-Datentyp

    In ISO C schon (-> stdbool.h).

    Probe-Nutzer schrieb:

    man sollte sich in der Lernphase auch mit den #define's auseinandersetzen, das wird man noch häufig genug in C-Code finden

    Das stimmt schon, nur solltest du Makros nicht überstrapazieren und nur dort verwenden, wo es Sinn macht.



  • @interpreter
    hab erst jetzt gesehen das du noch weiterspielen wolltest 😉
    da geh ich natürlich drunter 😃

    int h(char*c){int j=0;for(;*c;j=j<<4|*c++-48-7*(*c>57)&15);return j;}
    


  • Probe-Nutzer schrieb:

    schon mal daran gedacht, daß es hier um "K & R - C" geht

    groovemaster2002 schrieb:

    Also bei mir zeigt der Forumtitel, dass es um ANSI C (bzw. ISO C) geht.

    aha, wieder jemand, der jeden möglichen Interpretationsspielraum nutzt, wenn man ihm die Gelegenheit dazu gibt 😃 , dann schalte ich mal, wenn auch ungern, den Haarspaltungs-Modus ein:

    mir ist meistens klar, in welchem Forum ich mich befinde, auch dieses Mal war es so, mit hier war in meiner Antwort gemeint: in diesem Beitrags-Thread. 🙂

    Probe-Nutzer schrieb:

    da gibt es keinen bool-Datentyp

    groovemaster2002 schrieb:

    In ISO C schon (-> stdbool.h).

    auch das ist mir bekannt, nur in den K & R-Ausgaben, die sowohl cHillb3rT als auch /bin/bash0R als Lehrbuch verwenden, wird man diesen Datentyp evtl. vergeblich suchen. 😉

    Probe-Nutzer schrieb:

    man sollte sich in der Lernphase auch mit den #define's auseinandersetzen, das wird man noch häufig genug in C-Code finden

    groovemaster2002 schrieb:

    Das stimmt schon, nur solltest du Makros nicht überstrapazieren und nur dort verwenden, wo es Sinn macht.

    ganz meine Meinung 👍

    bitte nicht falsch verstehen, aber ich wollte nur klar stellen, wie es gemeint war, womit ich den Haarspaltungs-Modus wieder ausschalte 😃

    MfG



  • Windalf schrieb:

    @interpreter
    hab erst jetzt gesehen das du noch weiterspielen wolltest 😉
    da geh ich natürlich drunter 😃

    int h(char*c){int j=0;for(;*c;j=j<<4|*c++-48-7*(*c>57)&15);return j;}
    

    Ich hab grad noch ne rekursive Fassung geschrieben, aber die is viel zu lange 😞

    int h(char*s,int i, int j){return i>=0?(s[i]>57?(s[i]&15)+9:s[i]-48)*pow(16,j)+h(s,i-1,j+1):0;}
    
    // Aufruf:
    printf("%i",h(a,strlen(a)-1,0));
    

    Das dereferenzieren des Strings und der 3. Parameter brauchen zu viel Platz. Momentan fällt mir aber nicht ein, wie ich das umgehen könnte. 😡



  • @interpreter
    hmm rekursiv war diesmal bei mir auch schlechter

    int h(char*c){return*c?pow(16,strlen(c)-1)*(*c-48-7*(*c>57)&15)+h(c+1):0;}
    

    liegt in diesem speziellen fall daran das man wissen muss wie lang das teil ist, an sonsten ists ja nur knapp länger



  • Windalf schrieb:

    @interpreter
    hmm rekursiv war diesmal bei mir auch schlechter

    int h(char*c){return*c?pow(16,strlen(c)-1)*(*c-48-7*(*c>57)&15)+h(c+1):0;}
    

    liegt in diesem speziellen fall daran das man wissen muss wie lang das teil ist, an sonsten ists ja nur knapp länger

    Ja. Bei solchen Funktionen kommen einem Wörter wie "return" und "strlen" endlos lang vor 😃

    Naja, dein Training mit deadbeef hat sich ausgezahlt 🤡


Anmelden zum Antworten