Hexadezimal



  • Die Funktion strtol erwartet als ersten Parameter einen Zeiger auf einen String.



  • CJosef schrieb:

    Die Funktion strtol erwartet als ersten Parameter einen Zeiger auf einen String.

    Meinst du so?

    #include <stdio.h> 
    #include <stdlib.h> 
    
    int main () 
    { 
        char zahl[256]; 
        long int li1; 
        char *succ; 
    
        printf("Zahl eingeben:"); 
        scanf("%s",&zahl); 
    
        li1 = strtol (zahl,&succ,16); 
    
        printf("%ld",li1); 
    
        return 0; 
    }
    

    Führt leider auch nicht zum erwünschten Ergebnis.



  • Ja, so.
    Was ist denn dein erwünschtes Ergebnis?
    Ich weiß, der Compiler ist hart und erfüllt nur selten Wünsche. *scnr*
    Man tut ne Zahl (zu einer Basis gehörend) in den String rein, übergibt den String mit der Basis an strtol und bekommt das Ergebnis im Dezimalsystem.



  • CJosef schrieb:

    Ja, so.
    Was ist denn dein erwünschtes Ergebnis?
    Ich weiß, der Compiler ist hart und erfüllt nur selten Wünsche. *scnr*
    Man tut ne Zahl (zu einer Basis gehörend) in den String rein, übergibt den String mit der Basis an strtol und bekommt das Ergebnis im Dezimalsystem.

    Ja ich würde gerne eine Zahl in Hexadezimaldarstellung anzeigen.

    Beispiel: Zahl=1343244 Hexadezimal (in diesem fall zur Basis 16): 147f0c

    Bei mir gibt er 20197956 aus



  • 147f0c(16) -> 1343244(10)
    1343244(16) -> 20197956(10)
    Das hast du doch schon ganz oben gemacht, a la

    printf ( "%x\n", 1343244  );
    

    dafür brauchst du keine Konvertierungsfunktion.
    Vermutlich entspricht die Erklärung deines Vorhabens nicht wirklich dem, was du möchtest.
    😕



  • Ok ich versuche es verständlich zu erklären 😃

    Ich gebe eine dezimalzahl ein. Diese soll in Hexadezimaldarstellung angezeigt werden. Die gewünschte Basis gebe ich auch ein.

    Beispiel: Die Zahl 1343244 wird dezimal als 1 343 244, im Hexadezimalsystem (B = 16) als 14 7f0c, zur Basis 32 als 1 8voc und zur Basis 12 als 549410 geschrieben.

    Ist das Prinzip des codes richtig für diese Aufgabe?



  • canonflux schrieb:

    Wie kann ich das Programm so umwandeln, dass es mir den Hexadezimalwert für verschiedene Basen wie z.B 32 und 12 ausgibt?

    Ähh? Hexadezimal ist immer zur Basis 16.



  • canonflux schrieb:

    Ok ich versuche es verständlich zu erklären 😃

    Ich gebe eine dezimalzahl ein. Diese soll in Hexadezimaldarstellung angezeigt werden. Die gewünschte Basis gebe ich auch ein.

    Beispiel: Die Zahl 1343244 wird dezimal als 1 343 244, im Hexadezimalsystem (B = 16) als 14 7f0c, zur Basis 32 als 1 8voc und zur Basis 12 als 549410 geschrieben.

    Ist das Prinzip des codes richtig für diese Aufgabe?

    Ah, okay.
    Hexadezimal hat btw. die Basis 16 = const.
    strtol kann nur ins Dezimalsystem umwandeln, da wäre itoa etwas für dich:
    http://www.cplusplus.com/reference/cstdlib/itoa/
    Ist glaub ich keine Standardfunktion, ist aber wursch oder?



  • CJosef schrieb:

    strtol kann nur ins Dezimalsystem umwandeln, ....

    strtol wandelt ins interne Format. Meist ist dies das Dual/Binaersystem.

    printf (oder itoa) wandelt das dann in ein für Menschen gut lesbares Format um. Meist das Dezimalsystem.
    Aber ob Dezimal-, Hexadezimal oder was auch immer, es ist nur eine andere Darstellung des selben Wertes.



  • #include <stdio.h>
    #include <stdlib.h>
    
    int main ( void )
    {
    	char buf[256];
    	int number, base, base_min = 2, base_max = 36;
    	printf ( "Enter a decimal number to convert: " );
    	if ( 1 == scanf("%d", &number))
    		for ( base = base_min; base <= base_max; base++ )
    			printf ( "base: %2d number: %s\n", base, itoa ( number, buf, base ));
    	return 0;
    }
    


  • Warnung: Die folgende Lösung könnte für Sie schädlich sein (Original-Zitat).
    Häufige Nebenwirkunge sind Verständnislosigkeit, Depressionen und Angstzustände

    /*A031C_Basiswandler.cpp: Einstiegspunkt der Konsolenanwendung.*/
    /*Einfacher Basiswandler fuer Ganzzahlen*/
    
    #include <stdio.h>
    #include <stdlib.h> /*fuer system*/
    #include <string.h> /*fuer _strrev*/
    
    #ifdef __cplusplus
      #pragma message("mit C++")
    #else
      #pragma message("mit C")
    #endif
    
    void wandleIterativ(unsigned long nD,unsigned long nBasis) {
      char cErgebnis[80+1];
      /*_strset(cErgebnis,NULL); /*Angstanweisung*/
      unsigned char cZ,nI=0;
      while (nD>0) { /*Iteration*/
        cZ=(unsigned char)((nD%nBasis)+48); /*Ziffer*/
        if (cZ>57) cZ+=7; /*Buchstabe*/
        nD/=nBasis;
        cErgebnis[nI++]=cZ; /*hinten anhängen*/
      } /*while*/
      cErgebnis[nI]='\0';
      fprintf_s(stdout,"\nErgebnis zur Basis %lu: %s\n\n",nBasis,_strrev(cErgebnis));
    } /*wandleIterativ*/
    
    void wandleRekursiv(unsigned long nD,unsigned long nBasis) {
      unsigned char cZ;
      if (nD!=0) {
        cZ=(unsigned char)((nD%nBasis)+48); /*Ziffer*/
        if (cZ>57) cZ+=7; /*Buchstabe*/
        fprintf_s(stdout,"%c",cZ);
        wandleRekursiv(nD/nBasis,nBasis);
      } /*if*/
    } /*wandleRekursiv*/
    
    int main() {
      unsigned long nD,nBasis;
      do {
        fprintf_s(stdout,"Dezimale Ganzzahl: ");fflush(stdin);scanf_s("%ul",&nD);
      } while (nD>LONG_MAX); /*scanf ignoniert u, wandelt also in l, Test mit -1*/
      do {
        fprintf_s(stdout,"Zielbasis 2-36:   ");fflush(stdin);fscanf_s(stdin,"%ul",&nBasis);
      } while (nBasis<2||nBasis>36);
      wandleIterativ(nD,nBasis); /*Reihenfolge wird intern korrigiert*/
      fprintf_s(stdout,"Rekursions-Ergebnis in umgekehrter Reihenfolge: ");
      wandleRekursiv(nD,nBasis); /*Rekursion erzeugt die Ziffern in umgekehrter Reihenfolge*/
      fprintf_s(stdout,"\n\n");
      system("Pause");
      return 0;
    } /*main*/
    

    Beispiele auf der Konsole

    Dezimale Ganzzahl: 1343244
    Zielbasis 2-36:   16
    
    Ergebnis zur Basis 16: 147F0C
    
    Rekursions-Ergebnis in umgekehrter Reihenfolge: C0F741
    
    Drücken Sie eine beliebige Taste . . .
    
    Dezimale Ganzzahl:  1343244
    Zielbasis 2-36:   36
    
    Ergebnis zur Basis 36: SSGC
    
    Rekursions-Ergebnis in umgekehrter Reihenfolge: CGSS
    
    Drücken Sie eine beliebige Taste . . .
    


  • DirkB schrieb:

    CJosef schrieb:

    strtol kann nur ins Dezimalsystem umwandeln, ....

    strtol wandelt ins interne Format. Meist ist dies das Dual/Binaersystem.

    printf (oder itoa) wandelt das dann in ein für Menschen gut lesbares Format um. Meist das Dezimalsystem.
    Aber ob Dezimal-, Hexadezimal oder was auch immer, es ist nur eine andere Darstellung des selben Wertes.

    Ja, stimmt. Ich weiß, ich denke da nur nicht immer dran.
    Meistens ist es das Dual-/Binärsystem wenns nicht gerade der russische
    Setun-Computer ist, der im Ternärsystem, http://de.wikipedia.org/wiki/Setun
    oder der biologische Computer der Ansala, der im Quartärsystem (Science Fiction Adventure 🤡 ) arbeitet.
    Alles frisch gegoogelt 😃



  • Waldschrat schrieb:

    Warnung: Die folgende Lösung könnte für Sie schädlich sein (Original-Zitat).
    Häufige Nebenwirkunge sind Verständnislosigkeit, Depressionen und Angstzustände

    Ja, bei dem Code, kein Wunder! 😃 (scnr)
    Sprichst du aus Erfahrung? 😮



  • Schreib doch bitte bei deinen nächsten Programmen noch dazu mit welchem Compiler, Betriebssystem und Codepages du das Programm compilierst.

    Neben bei ist hier das Unterforum für Standard-C. Da gibt es Funktionen wie _strrev nicht. 😞

    Und wenn du '0' meinst, dann schreib auch '0' hin und nicht 48

    Tipp: wenn du die Ausgabe in wandleRekursiv nach dem rekursiven Aufruf machst, ist die Reihenfolge auch richtig.



  • Ich versuche das mit itoa () zu lösen, aber leider erkennt mein Compiler den nicht.

    Hab mal bisschen geguckt und das hier als Ersatzfunktion gefunden:

    char *my_itoa(int wert, int laenge) {
        char *ret =(char *) malloc(laenge+1 * sizeof(char));
        int i;
    
        for(i  =0; i < laenge; i++) {
            ret[laenge-i-1] = (wert % 10) + 48;
            wert = wert / 10;
        }
        ret[laenge]='\0';
        return ret;
    }
    

    Kann ich das verwenden? Wenn ja, wie verhält es sich mit den Werten, die ich in der Funktion verwende. Ich kann ja in die Funktion nur 2 (myitoa(x,y)) Variablen statt 3 (itoa (x,y,z)) einbinden.



  • Erkennt er nicht? Hmmm ... welchen Compiler hast du?
    Bei mir ist die Funktion in stdlib.h deklariert.
    Vllt. ist es bei dir eine andere Headerdatei.



  • Die Funktion wird dir nicht viel nützen, da dort die Basis fest auf 10 eingestellt ist.
    Das Problem für dich wird wohl die Darstellung der Buchstaben sein.

    Zudem wird in der Funktion Speicher per malloc angefordert, den du dann ausserhalb der Funktion wieder freigeben musst.
    Das ist schlechtes Design.



  • itoa gehört nicht zum Standard von C.
    Deswegen heißt sie manchmal auch _itoa() (mit einem _ davor)



  • CJosef schrieb:

    Erkennt er nicht? Hmmm ... welchen Compiler hast du?
    Bei mir ist die Funktion in stdlib.h deklariert.
    Vllt. ist es bei dir eine andere Headerdatei.

    Ich benutze gcc auf Linux. Scheint es nicht zu geben. Gibt es eine andere Alternative für itoa?


  • Mod

    canonflux schrieb:

    Gibt es eine andere Alternative für itoa?

    Warum lernst du denn programmieren? Juckt es dich nicht in den Fingern, das selber zu schreiben? Ist nicht schwer. Ich hätte es dir hier längst vorgemacht, wenn ich nicht der Meinung wäre, dass du ohne Komplettlösung wesentlich mehr lernen würdest. Hier ein Tipp, um die einzige Schwierigkeit (die Mischung aus Zahlen und Buchstaben) zu überwinden:

    const char* ziffern = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
    
    // Somit gilt:
    ziffern[0] == '0';
    ziffern[5] == '5';
    ziffern[10] == 'A';
    ziffern[16] == 'G';
    

Anmelden zum Antworten