int nach string wandeln - Gegenstueck zu atoi



  • Mit atoi kann ich unter C eine Zahl in einen String umwandeln, fuer den Rueckweg wird der 'Trick' mittels scanf empfohlen.

    Da liegt es fuer mich als Anfaenger natuerlich nahe scanf in eine Function zu legen, was erstens uebt und zweitens meinen Code lesbarer macht.

    Realisiert habe ich das mal so:

    #include <stdio.h>
    #include <string.h>
    
    int main (void) {
    
        int i;
        int n;
    
        printf("Bitte geben Sie eine Zahl ein : ");
        scanf("%d",&i);
    
        n = anzahl(i);
        printf ( "Die Zahl %i besteht aus %i Ziffern!\n", i, n );
    }
    
    anzahl (arg1)
    {
    
        int zeichen;
        char buffer[100];
        sprintf(buffer, "%d", arg1);
    
        zeichen = strlen(buffer);
    
        return zeichen;
    
    }
    

    und schon habe ich wieder einige Fragen:

    1. Gibt es wirklich keine fertige C Function dafuer?

    2. Das ganze funktioniert natuerlich nur bis zu einer bestimmten Groesse wegen de Deklaration als int, in meinem Falle bis zu 10 Ziffern. Bei Zahlen > 10 Ziffern gibt das Programm aber keine Fehlermeldung, sondern eine 'Zufallszahl' zurueck. Das sieht dann so aus:

    [root@gbs01 ncurses]# ./test
    Bitte geben Sie eine Zahl ein : 1234567890
    Die Zahl 1234567890 besteht aus 10 Ziffern!

    [root@gbs01 ncurses]# ./test
    Bitte geben Sie eine Zahl ein : 12345678901
    Die Zahl 2147483647 besteht aus 10 Ziffern!

    Wie fange ich diese Verhalten ab, oder besser, wie erzeuge ich eine entsprechende Fehlermedung like "Zu grosse Zahl eingegeben"? Einfach auf die groesstmoegliche Zahl von 2147483647 (das sollte sie bei Linux wohl sein) pruefen?

    Wie gesagt, es geht mir nur um die Funktion, nicht um main, wobei ich natuerlich auch da fuer etwaige Tipps immer dankbar bin.

    Und bei der Gelegenheit gleich noch eine Frage: Sehe ich es richtig, dass auf einem 32bit System (hier Linux) int und long den gleichen Wertebereich haben, naemlich –2147483648 +2147483647? Wenn ja, welchen Typ nehme ich denn in meinem Beispiel, wenn ich den Wertebereich vergroessern moechte?

    Guenther
    Davao City, Philippines, Planet Earth



  • Die Anzahl der Zeichen einer Zahl lassen sich viel leichter ermitteln.

    Teile deine Zahl einfach durch Zehn und runde nach unten. Also die normale Integer-Division durch 10. Zähle, wie oft du das machen kannst, bis 0 raus kommt. Die Anzahl der Stellen ist dann die Anzahl der Divisionen.



  • du kannst itoa nutzen.

    mfg,
    julian



  • snprintf() ist die C-Funktion die für diese Art der Unwandlung zuständig ist.

    Da du im C++ Forum gefragt hast nehme ich an, dass du aber eigentlich mit C++ arbeitest, dann solltest du die stringstreams verwenden.



  • ProgChild schrieb:

    Teile deine Zahl einfach durch Zehn und runde nach unten. Also die normale Integer-Division durch 10. Zähle, wie oft du das machen kannst, bis 0 raus kommt. Die Anzahl der Stellen ist dann die Anzahl der Divisionen.

    Davon habe ich schon mal gehoert, hab's aber nicht begriffen. Wenn ich die Zahl 4711 durch 10 dividiere kommt doch 471 raus, richtig waere aber 4.

    Wo stehe ich denn da auf'm Schlauch?

    Sorry, ich uebe mich heute schon wieder seit mehr als 10 Stunden in C/C++, vieleicht solte ich auch einfach mal 'ne Pause machen ...



  • Da du hier im C++-Teil des Forums schreibst, gehe ich auch mal davon aus, dass du ein C++-Programm schreiben willst.

    Für Ein- und Ausgabe verwendet man cin und cout (resp. cerr für Fehler und clog für Logs).

    Folgender Code-Schnipsel sollte dich auf den richtigen Weg bringen:

    #include <iostream>	// Für Ein- und Ausgabe
    using namespace std;
    
    int main(int argc, char** args)
    	{
    		cout << "Bitte geben Sie eine Zahl ein: " << flush;
    
    		int i;		
    		if(!(cin >> i)) {
    			cerr << "Something went wrong!" << endl;
    		}
    
    		cout << endl << i << endl;
    
    		return 0;
    	}
    

    cin kümmert sich hier um die Eingabe. Wenn hier irgendwas nicht ganz korrekt abgelaufen ist (zum Beispiel auch der Überlauf) wird false zurückgegeben. cin kümmert sich direkt um die Typkonvertierung (const char* nach int) und liefert auch einige Fehler-Flags, die mir aber nun nicht ad hoc einfallen wollen.

    Für die Stellenberechnung kannst du die oben bereits erwähnten Verfahrensweisen verwenden.

    Die Obergrenzen der einzelnen Datentypen kannst du dem Standard-Header climits entnehmen.

    Grüße...

    Heiko



  • gboelter schrieb:

    Davon habe ich schon mal gehoert, hab's aber nicht begriffen. Wenn ich die Zahl 4711 durch 10 dividiere kommt doch 471 raus, richtig waere aber 4.

    Wo stehe ich denn da auf'm Schlauch?

    Du musst noch ein paar mal öfter dividieren und zählen, wie oft 😉

    Eingabe:
    x = Eine Zahl
    
    Ausgabe: 
    Anzahl der Stellen von x
    
    stellen = 0
    solange [latex]x \not= 0[/latex]
       [latex]x =  \left\lfloor \frac{x}{10} \right\rfloor [/latex]
       stellen = stellen + 1
    
    gib stellen aus
    

    Bedeutet im Beispiel

    x = 4711, stellen = 0
    x = 471,  stellen = 1
    x = 47,   stellen = 2
    x = 4,    stellen = 3
    x = 0,    stellen = 4
    

    Soweit verständlich?



  • Ok, da ist jetzt gerade der Groschen bei mir gefallen. Und sorry fuer den Code, da war wirklich noch etwas viel C drin, aber es ging mir eben auch nicht darum, wie ich das programmiere sondern nur um das Verstaendnis.

    Ich danke Euch fuer die schnelle Hilfe. Irgendwann kann ich mich bestimmt mal revanchieren.

    Guenther


Anmelden zum Antworten