float, int to char



  • Hi,

    wie kann man float, int und co zu char umwandeln OHNE das man Funktionen benutzt aus C oder C++? Also Hardcore-Coding sozusagen 🙂



  • float a = 5.0;
    int b = 3;
    char x = a;
    char y = b;
    

    Meinst du das?



  • also auf die schnell habe ich eine Funktion für Int geschrieben:

    int Rechnen (int, int) ;
    
    void main (void){
    char szChar[4] ;
    int iInt = 615 ;
    szChar[0] = Rechnen (iInt, 100) ;
    szChar[1] = Rechnen (iInt, 10) ;
    szChar[2] = Rechnen (iInt, 1) ;
    szChar[3] = '\0' ;
    printf ("Zahl %s", szChar) ;
    }
    
    int Rechnen (int iZahl, int Radix){
        int iCheck ;
        iCheck = iZahl % (Radix * 10) ;
        iCheck = iCheck - (iCheck % Radix) ;
        if (iCheck == (1 * Radix))
            iZahl = 1 ;
        else if (iCheck == (2 * Radix))
            iZahl = 2 ;
        else if (iCheck == (3 * Radix))
            iZahl = 3 ;
        else if (iCheck == (4 * Radix))
            iZahl = 4 ;
        else if (iCheck == (5 * Radix))
            iZahl = 5 ;
        else if (iCheck == (6 * Radix))
            iZahl = 6 ;
        else if (iCheck == (7 * Radix))
            iZahl = 7 ;
        else if (iCheck == (8 * Radix))
            iZahl = 8 ;
        else if (iCheck == (9 * Radix))
            iZahl = 9 ;
        else if (iCheck == (0 * Radix))
            iZahl = 0 ;
        return iZahl + 48 ; // 48 = ASCII für 0
    }
    

    in der main () musst du noch die überprüfung machen wieviel stellig die Int ist...

    ich hoffe ich habe dir geholfen.



  • das geht sicher einfacher mit einer Schleife:

    // Pseudo Code
    // basis muß > 1 sein
    Ergebnis := Leerstring
    falls zahl = 0:
      gebe "0" zurück
    falls zahl negativ:
      hänge Minuszeichen an Ergebnis an
    solange zahl nicht 0:
      hänge das Ziffernzeichen von zahl mod basis an das Ergebnis an // leicht machbar bis basis 36
      teile Zahl durch Basis
    drehe Ergebnis um
    gebe Ergebnis zurück
    


  • @Bashar
    Also quasi wie strtoul das macht 😉
    EDIT: Äh, umgekehrt 😃

    [ Dieser Beitrag wurde am 15.05.2003 um 13:26 Uhr von MaSTaH editiert. ]



  • Jo klar. Wenn die Vorgabe ist, diese Funktionen ohne Library zur Verfügung zu stellen, muß man sie nachimplementieren.



  • @Bashar
    Also dein Pseudocode ist mir ein Rätsel. Ist es möglich dass du es in "C" umschreibst?



  • Du würdest es dann auch nicht verstehen.



  • Original erstellt von Bashar:
    Du würdest es dann auch nicht verstehen.

    😡 😡 😡



  • Da hat Bashar recht. Sein Pseudocode ist doch einfacher als fertiges C.

    void int2str(char* str,int x,int basis)
    {
     char* pos=str;
     // basis muß > 1 sein
     assert(basis>1);
    //Ergebnis := Leerstring
     *pos='\0';
    //falls zahl = 0:
     if(x==0)
    //  gebe "0" zurück
     {
      strcpy(pos,"0");
      return str;
     }
    //falls zahl negativ:
     if(x<0)
    //  hänge Minuszeichen an Ergebnis an
     {
      *pos++='-';
      x=-x;
     }
    //solange zahl nicht 0:
     while(x!=0)
    //  hänge das Ziffernzeichen von zahl mod basis an das Ergebnis an 
    //   leicht machbar bis basis 36
     {
      char ch=x%10;
      if(ch<10)
       *pos++=x+'0';
      else
       *pos++=x-10+'a';
    //  teile Zahl durch Basis
      x/=10;
     }
    //drehe Ergebnis um
     {//das lass ich mal aus
     }
    //gebe Ergebnis zurück
     return
    


  • würd ichs für mich brauchen, würd ich vermutlich sowas machen.

    char* uint2str(unsigned int x)
    {
     static char buf[AUSREICHEND+VORZEICHENPLATZ]={0};
     char pos=buf+sizeof(buf)-1;
     *pos='\0';//diese zeile evtl weg und dafür const zurückgeben
     do
      *--pos=x%10;
     while(x/=10);
     return pos;
    }
    char* uint2str(signed int x)
    {
     char* pos=uint2str(abs(x));
     if(x<0)
      *--pos='-';
    }
    


  • @Bashar
    ich habe es doch verstanden (ich brauche immer etwas länger... hehehe).
    Ich habe dein Pseudocode in die Tat umgesetzt (das von @volkard ist voller Fehler).
    Das Problem ist noch das 2 Warnungen kommen (es funzt aber...):

    c:\test.cpp(23) : warning C4172: Adresse einer lokalen Variablen oder eines temporaeren Wertes wird zurueckgegeben
    c:\test.cpp(36) : warning C4172: Adresse einer lokalen Variablen oder eines temporaeren Wertes wird zurueckgegeben

    test.obj - 0 Fehler, 2 Warnung(en)*

    hier der code:

    #include <stdio.h>
    #include <string.h>
    
    char *Funktion (int) ;
    
    void main (void){
        int iInt = 5600 ;
        char szInt[11] ;
        strcpy (szInt, Funktion (iInt)) ;
        printf ("%s", szInt) ;
    }
    
    char *Funktion (int x){
        char    szString[10],
                szRuckgabe[10] ;
        int     iZahl_1 = 0,
                iZahl_2 = 0 ;
        if (x == 0){
            szRuckgabe[0] =  '0' ;
            szRuckgabe[1] = '\0' ;
            return szRuckgabe ;
        }
        szString[0] = '\0' ;
        do{
            szString[iZahl_1++] = (x % 10) + 48 ;
        }
        while (x/=10) ;
        szString[iZahl_1] = '\0' ;
        iZahl_1-- ;
        for (; iZahl_1 >= 0 ; iZahl_1--, iZahl_2++){
            szRuckgabe[iZahl_2] = szString[iZahl_1] ;
        }
        szRuckgabe[iZahl_2] = '\0' ;
        return szRuckgabe ;
    }
    
    was mache ich noch falsch?
    


  • P.S.
    ich möchte die Strings nicht global behandeln.



  • dann uebergib der funktion einen zeiger auf den speicherbereich inden der rueckgabewert geschrieben werden soll.

    fuer beispiele siehe zB strcpy oder itoa



  • ich möchte die Strings nicht global behandeln.

    Haste meine Umsetzung Bashars Pseudocode angeschaut? Kommt Dir ne Idee dabei?

    [ Dieser Beitrag wurde am 19.05.2003 um 06:22 Uhr von volkard editiert. ]


Anmelden zum Antworten