char to integer (eigene funk.)



  • hallo
    ich will ein char-array in ein integer umwandeln (jaja,da gibt es schon funktionen für ich weiss)
    folgendes hab ich mir gedacht:

    1. 1684 z.B. lässt sich ja auch so schreiben:
      (1*1000)+(6*100)+(8*10)+(4*1)
    2. wenn a ein char und b ein int kann ich b=a-'0'; machen.
    3. dann füll ich die werte in ein array und errechne daraus meine zahl.(siehe 1)

    erstmal mein programm:
    < wird so aufgerufen: char_to_int(char_original,ziel_integer); >

    void char_to_int(char s[],int x)
    {
    int i=0;
    int temp[11];
    
    //set array to -1
    for (i=0;i!=11;i++)
    {temp[i]=-1;}
    
    //convert all char's to integer,save in temp[]
    i=0;
    while (s[i]!='\0')
        {
        cout <<"stelle: "<<i<<"\n";
        temp[i]=s[i]-'0';
        cout <<"wert:"<<temp[i]<<"\n";
        i++;
        cout <<"\n------\n";
        }
    i=0;
    x=0;
    int y=10;
    //calculate x from temp[]
    while (temp[i]!=-1){
        cout <<"\n"<<i<<" "<<temp[i];
        x=x+  (  temp[i]*pow(10, (y-i-1))  );
        i++;
        }
    cout <<"\n X IST "<<x<<"\n";
    }
    

    Fehler:
    die Zahl 1684 wird als 1684000000 berechnet,steigt jemand durch mein prog. durch und weiss wie ich dass elegant wegbekomme? (mir fällt nur ein, noch irgendwie eine schleife einzufügen aber das kanns ja nicht sein..)

    danke für jeden hinweis!

    ps: ot:gibt es in diesem forum eine vorschau funktion?



  • vielleicht so

    void char_to_int(char s[])
    {
    int i=0,x=0;
    int temp[11];
    
    //convert all char's to integer,save in temp[]
    while (s[i])
        {
        cout <<"stelle: "<<i<<"\n";
        temp[i]=s[i]-'0';
        cout <<"wert:"<<temp[i]<<"\n";
        ++i;
        cout <<"\n------\n";
        }
    
    temp[i]=-1;
    int y=i-1;
    i=0;
    
    //calculate x from temp[]
    while (temp[i]!=-1)
       {
        cout <<"\n"<<i<<" "<<temp[i];
        x=x+ ( temp[i]*pow(10, (y-i)) );
        ++i;
       }
    cout <<"\n X IST "<<x<<"\n";
    }
    

    btw, cout ist kein C

    MfG Lem



  • @<Lem>: <blödsinn-mode> wenn oben steht int cout; und diese komischen "bla" dinger durch 'bla's ersetzt werden müsstes gehn. </blödsinn-mode>



  • Naja, wenn man die "komische dinger" schön findet, sollen die von mir aus auch bleiben. Funktionieren tut's ja.

    MfG Lem



  • Du (Angezeigter Benutzername) verwendest zwei Schleifen für die Berechnung, eine um die Werte der Stellen zu speichern, und eine um diese Werte zu verarbeiten. Das ganze geht einfacher, indem Du Berechnung der Stellenwerte und deren Verarbeitung kombinierst, um nur eine Schleife durchlaufen zu müssen oder die Funktion rekursiv aufzurufen.

    Eine Variante mit einer Schleife ist diese (ohne deine Ausgabebefehle):

    int char_to_int (char *s)
    {
        int sign = 1, n;
        if (*s == '+' || *s == '-')
            sign = (*(s++) == '+') ? 1 : -1;
        for (n = 0; *s >= '0' && *s <= '9'; s++)
            n = 10 * n + *s - '0';
        return sign * n;
    }
    


  • An einer rekursiven Variante bin ich einige Zeit gesessen, und die ist sicher alles andere als elegant:

    /* dreht einen String einfach um */
    char *reverse (char *s)
    {
        int c, i, j;
    
        for (i = 0, j = strlen(s) - 1; i < j; i++, j--) {
            c = s[i];
            s[i] = s[j];
            s[j] = c;
        }
        return s;
    }
    
    int ctoi (char *s)
    {
        return (*s <= '9' && *s >= '0') ? *s - '0' + 10 * ctoi(s + 1) : 0;
    }
    
    int char_to_int2 (char *s)
    {
        int sign = 1;
        if (*s == '+' || *s == '-')
            sign = (*(s++) == '+') ? 1 : -1;
        reverse(s);
        return sign * ctoi(s);
    }
    


  • danke für die antworten.
    aber in der zeile
    x=x+( temp[i]*pow(10, (y-i)));
    krieg ich jetzt folgende meldung:
    [Warning] assignment to `int' from `double'
    das lieg wahrscheinlich an dem pow() weil die funktion ein double zurückgibt(?)



  • Das wird wohl so sein. Du kannst aber den double Wert in einen int Wert umwandeln (durch Abschneiden der Nachkommastellen):

    x = (double)(x + (temp[i] * pow(10, (y-i))));
    

    So sollt's gehen.



  • danke jetzt funkt es, aber es it nicht
    x = (double)(x + (temp[i] * pow(10, (y-i))));
    sondern
    x = (int)(x + (temp[i] * pow(10, (y-i))));
    bzw.
    x = int(x + (temp[i] * pow(10, (y-i)))); (klammern kann man weglassen)
    trotzdem vielen danke! 😉


Anmelden zum Antworten