Kiffliges Problem



  • Hi,

    hab ein Problem, dass wirklich ein wenig außergewöhlich ist.

    Folgendes:

    Ich habe ein char const * in dem auf die chars verteilt der String 0x0200 steht.
    Also 6 charakters mit, wie zu sehen ist, einem Hexwert. 😮

    Nun will ich diesen String in eine Dezimalzahl, wandeln nur wie?
    Nochmal der Code:

    function(char const *pstr)
    {
    
    /* in pstr steht also (ptr[0])->0, (pstr[1])->x usw. */
    
    int zahl;
    
    zahl = atoi(pstr)   --------> hier mein problem !!!!
    
    switch(zahl)
    {
    }
    

    Ich hoffe es ist einigermaßen verständlich was das machen soll.

    Bin dankbar für jede Idee 🙂

    codeman



  • strtol()



  • Hi TactX,

    hört sich gut an und macht wohl was ich will.
    Nur ist mir der end-zeiger-zeiger nicht ganz klar was der macht.
    Schau hier:

    #include <stdlib.h>
    
    long strtol(const char *begin, char **end, int base);
    
    Description:
    
    strtol() converts the initial portion of begin to “long int” representation.
    
    begin    is a pointer to the beginning of the string. (Input)
    end      is a pointer to the pointer to the first character after the
               converted string. (Input)
    base     is the base of the number string. (Input)
    

    Edit: Kann das sein das er den Konvertierten string dort ablegt wo der Zeiger end hinzeigt? Ich dachte die Konvertierung kommt als double zurück!!

    codeman



  • codeman schrieb:

    Edit: Kann das sein das er den Konvertierten string dort ablegt wo der Zeiger end hinzeigt? Ich dachte die Konvertierung kommt als double zurück!!

    Double? 😕

    long int kommt raus.

    Der char **endptr wird zur Fehlererkennung verwendet und kann (wie bestimmt in der manpage steht) NULL sein, wenn du auf Fehlererkennung verzichten kannst.



  • Jo klar, hab mich nur verschrieben mit dem Double 😃

    Habs geschnallt danke auch und schönes Wochenende, der Sommer naht 🕶

    codeman



  • Nach der Überschrift habe ich schon gedacht es ginge ums kiffen 🤡



  • immigrant schrieb:

    Nach der Überschrift habe ich schon gedacht es ginge ums kiffen 🤡

    Hehe, ich konnte mir den Kommentar verkneifen 😃



  • Hopps, ist unfreiwillig ein guter Versprecher geworden 😃



  • Hi,

    also ich habs mal mit strtol() probiert. Problem ist, bei mir kommt immer 0 raus.
    Steht also in dem String 0x0302 dirn, bekomme ich nicht in dezimal 770, sondern 0.

    Ich hab keine Ahnung warum das so ist, vielleicht hat jemand ne Idee.

    codeman



  • Alles klar habs!!!

    Funktion strtol() bricht bei dem x der hexa defination 0x ab und liefert den bis dahin konvertierten Wert, der nun 0 ist. Schade auch das man das nicht so schreiben kann, da nun bei 0302 nicht mehr richtg ersichtlich ist das es sich um einen hexa Wert handelt. Aber thats it 😃

    codeman



  • codeman schrieb:

    Alles klar habs!!!

    Funktion strtol() bricht bei dem x der hexa defination 0x ab und liefert den bis dahin konvertierten Wert, der nun 0 ist. Schade auch das man das nicht so schreiben kann, da nun bei 0302 nicht mehr richtg ersichtlich ist das es sich um einen hexa Wert handelt. Aber thats it 😃

    codeman

    Da sagt die manpage (man: strtol) aber was anderes.

    strtol(foo,NULL,0);
    

    Sollte eigentlich funktionieren...



  • The remainder of the string is converted to a long, long long, or
    intmax_t, value in the obvious manner, stopping at the first character
    which is not a valid digit in the given base. (In bases above 10, the
    letter `A' in either upper or lower case represents 10, `B' represents
    11, and so forth, with `Z' representing 35.)

    Scheint so zu sein, dass bei 0x das x als 33 interpretiert wird, wäre aber leider auch nicht richtig. Es soll ja lediglich den Wert als Hexa markieren, bzw. in Ansi schreibweise macht man es halt so.

    Aber wenn du mir ein Beispiel bringen könntest wäre nett, denn ich würde es schon gerne einbauen. 🙂

    Edit: Hab das gefunden

    Für das Duale Zahlensystem sind die Zeichen 0 und 1 gültig, für das Zehnerzahlensystem die Zeichen 0 bis 9 und für das hexadezimale Zahlensystem dürfen Zeichen 0 bis 9 und A bis F verwendet werden.

    Steht hier: http://www.goblack.de/desy/sc12chip/c/bibliothek/strtol.html

    codeman



  • If base is zero or 16, the string may then include a `0x' prefix, and the number will be read in base 16;

    test = strtol("0x0302",NULL,0); // funktioniert wunderbar
    


  • Ja haut einwandfrei hin!!! 😉

    Ich hatte noch netterweise einen Debuger laufen, und so hat das makefile das ausführbare cgi-script nicht neu überschrieben. 😡

    Manchmal kann eine ein Debug ein Segen, manchmal auch ein Fluch sein 🙄

    Dank dir für deine Mühen, 👍

    codeman


Anmelden zum Antworten