Funktion htoi umstellen



  • Joe1903 schrieb:

    Oh ja.Was ist mit A-F?

    Es gibt die Funktion tolower aus ctype.h

    Joe1903 schrieb:

    Und mit s müsste ich jetzt die Berechnung machen

    Ja.

    Joe1903 schrieb:

    oder (n=c[s]*16^n?)

    Nein, denn c[s] ist ein Zeichen

    Der Operator ^ ist in C nicht die Potenz.
    Du kannst auch das Zwischenergebnis mit 16 multiplizieren (oder um 4 Bits nach links schieben).



  • Joe1903 schrieb:

    Oh ja.Was ist mit A-F?

    Du kannst die Zeile "if (hex[s] == c)" in "if (hex[s] == tolower(c))" abändern. Dann frisst er das auch.

    Joe1903 schrieb:

    Und mit s müsste ich jetzt die Berechnung machen oder (n=c[s]*16^n?)

    Du fügst z.B. ein weiteres Argument ein, also diese Signatur: "int getHexDigitValue (char c, unsigned pos)" <-- Stelle der Hexziffer
    Und dann änderst du die Zeile "return s;" in "return s * (int)pow(16.0, pos);". Das ist schon mal die halbe Miete.

    Viel Spaß. 🙂



  • DirkB schrieb:

    Joe1903 schrieb:

    oder (n=c[s]*16^n?)

    ...
    Der Operator ^ ist in C nicht die Potenz.

    Da bin ich gar nicht drauf gekommen, daß das eine Potenz sein sollte.
    Ich hab mir nur gedacht: "Huch, das ist aber eine gewagte Konstruktion, deren Sinn sich mir nicht wirklich erschließt."



  • Mir fällt noch ein: anstelle von "pow" kann man die Sechzehnerpotenzen auch in einem Array ablegen. 4 Stück sollten wohl erstmal reichen: 1, 16, 256, 4096.


  • Mod

    Andromeda schrieb:

    Mir fällt noch ein: anstelle von "pow" kann man die Sechzehnerpotenzen auch in einem Array ablegen. 4 Stück sollten wohl erstmal reichen: 1, 16, 256, 4096.

    16 hoch x = 1 << 4*x
    Nicht weiter erzählen, ist ein Mathematikergeheimnis.



  • Für sowas benutzt man sscanf.



  • Andromeda schrieb:

    Mir fällt noch ein: anstelle von "pow" kann man die Sechzehnerpotenzen auch in einem Array ablegen. 4 Stück sollten wohl erstmal reichen: 1, 16, 256, 4096.

    Potenzen sind doch gar nicht nötig

    int my_atoi(char s[]) // Wandelt Dezimalstring in int um. Ohne Vorzeichen
    {  
      int ret = 0;
      while (isdigit(*s))
      { i *= 10;          // Basis 10
        i += *s++;
      }
    
      return ret;
    }
    


  • Wutz schrieb:

    Für sowas benutzt man sscanf.

    Lass die Leute doch mal die Grundlagen lernen.



  • Aber nicht anhand von Deppen-Aufgaben, die die Standardbibliothek erledigen kann.



  • Wutz schrieb:

    Aber nicht anhand von Deppen-Aufgaben, die die Standardbibliothek erledigen kann.

    Vielleicht braucht er das eine kleine MCU mit wenig Flash und RAM. Da sind Schwergewichte wie sscanf eher nicht so toll.



  • DirkB schrieb:

    Andromeda schrieb:

    Mir fällt noch ein: anstelle von "pow" kann man die Sechzehnerpotenzen auch in einem Array ablegen. 4 Stück sollten wohl erstmal reichen: 1, 16, 256, 4096.

    Potenzen sind doch gar nicht nötig

    int my_atoi(char s[]) // Wandelt Dezimalstring in int um. Ohne Vorzeichen
    {  
      int ret = 0;
      while (isdigit(*s))
      { i *= 10;          // Basis 10
        i += *s++;
      }
    
      return ret;
    }
    

    Stimmt. Aber sein erster Code ist immer noch der beste (wenn er denn funktioniert). 🙂



  • @Joe1903: Es macht überhaupt keinen Sinn hier ständig Fragen zur Erweiterung/Umstellung von Code zu stellen, den Du irgendwo im Internet gefunden hast, wo er als Lösung zu K&R Aufgaben eingestellt wurde.

    Das verwirrt nur, weil niemand einschätzen kann, auf welchem Stand Du bist.

    Abgesehen davon ist die Lösung bestenfalls Mittelmaß.


Anmelden zum Antworten