Bibliotheksfunktion atoi?



  • Der Ansatz ist ja schonmal ok, und offensichtlich hast Du mit Pointern noch nie gearbeitet, sehe ich das richtig? Also das ist eigentlich ganz einfach und lohnt wirklich! Lies dir am besten mal etwas dazu durch und probiers aus, das ist nicht schwer 😉 (Auch wenn es am Anfang vielleicht so scheint)

    Und zu deiner Schleife:
    Du machst immer noch Dinge die nicht notwändig sind!
    Man kann (siehe vorher geposteter Code) auch immer erst "links shiften" (also * 10 im Dezimalsystem) wenn man eine neue Zahl findet. Also:

    while ..
    {
      zahl = zahl * 10; //oder auch zahl *= 10;
      zahl = zahl + (string[i] - '0'); // oder auch zahl += string[i] - '0';
      i = i + 1; // oder auch i += 1; oder ++i; oder i++;
    }
    

    Würde also zB. folgendes passieren:
    -in string steht "123"
    -zahl ist 0

    1. Durchlauf
    0 * 10 = 0 // zahl bleibt 0
    0 + 1 = 1 // zahl ist jetzt 1

    2. Durchlauf
    1 * 10 = 10
    10 + 2 = 12

    3. Durchlauf
    12 * 10 = 120
    120 + 3 = 123

    fertig 😃

    Desweiteren wird die Variable "sign" nirgendwo verwendet.
    Sieh dir noch mal den anderen code an und komplettier das 😉



  • Hm, wenn man mal eine Nacht drüber geschlafen hat, dann gehts gleich viel besser 🙂 Hier mal mein neuer Code. So wie es schein funktioniert dieser jetzt auch für alle Möglichkeiten, sprich mit/ohne Vorzeichen und/oder mit/ohne führende/folgende Leerzeichen. Pointer glaub ich ab ich soweit auch korrekt angewendet. Eine Frage hab ich dann noch: Dieses ++string, hab ich mir aus euren Code-Beispielen abgeguckt. Dieses Teil schaltet ja die Stellen im String weiter. Ich denke, das ist soviel wie mein vorheriges i=i+1 wie ich noch keine Pointer verwendet habe. Was aber verbirgt sich dahinter? Wenn ich ++i (Prä/Postfix) schreibe, dann bedeutet das ja i=i+1. Was ist dann aber das äquivalten zu ++string? string = string + 1; geht nicht hab ich ausprobiert, genausowenig geht *string = *string + 1;. Könnt ihr mich da aufklären?

    #include<stdio.h>
    #include<stdlib.h>
    #include<ctype.h>
    #include<string.h>
    
    char* string_eingeben(char *string)
    {
    	int i = 0;
    	char zeichen;
    	zeichen = getchar();
    
    	while(zeichen != '\n')
    	{
    		*string = zeichen;
    		zeichen = getchar();
    		++string;
    	}
    	*string = '\0';
    
    	return string;
    }
    
    int my_atoi(char *string)
    {
    	int i = 0, zahl = 0, sign = 1;
    
    	while(*string == ' ' || *string == '\t')
    	{
    		++string;
    	}
    
    	if(*string == '-')
    	{
    		sign = -1;
    		++string;
    	}
    
    	while(*string != '\0' && *string >= '0' && *string <= '9')
    	{
    		zahl = zahl * 10;
    		zahl = zahl + (*string - '0');
    		++string;
    	}
    	zahl = zahl * sign;
    	return zahl;
    }
    
    int main()
    {
    	char string[100];
    	int zahl;
    
    	string_eingeben(string);
    	zahl = my_atoi(string);
    
    	printf("my_atoi: int-Zahl = %i\n", zahl);
    
    return 0;
    }
    

    EDIT: Oh mann! Bis vor 5 min. hat der obige Code noch funktioniert. Jetzt hab ich irgendwas verändert und jetzt geht nix mehr! Und ihr könn sicher schon vermuten, dass ich es nicht weiß was fuckt...

    EDIT2: Hab den Fehler gefunden. Ich hab sign dummerweise mit 0 initialisiert! Dass, das nix wird war klar... Jetzt geht der Code jedenfalls... Auf zur nächsten Aufgabe... 🙂



  • Wo hast du denn string = string + 1; bzw *string = *string + 1; ausprobiert?

    Wie wärs noch mit einem + als Vorzeichen?



  • Code mit zusätzlichem + als Vorzeichen:

    #include<stdio.h>
    #include<stdlib.h>
    #include<ctype.h>
    #include<string.h>
    
    char* string_eingeben(char *string)
    {
        int i = 0;
        char zeichen;
        zeichen = getchar();
    
        while(zeichen != '\n')
        {
            *string = zeichen;
            zeichen = getchar();
            ++string;
        }
        *string = '\0';
    
        return string;
    }
    
    int my_atoi(char *string)
    {
        int i = 0, zahl = 0, sign = 1;
    
        while(*string == ' ' || *string == '\t')
        {
            ++string;
        }
    
        if(*string == '-')
        {
            sign = -1;
            ++string;
        }
    
    	if((*string == ' ') || (*string == '+'))
    	{
    		sign = +1;
            ++string;
    	}
    
        while(*string != '\0' && *string >= '0' && *string <= '9')
        {
            zahl = zahl * 10;
            zahl = zahl + (*string - '0');
            ++string;
        }
        zahl = zahl * sign;
        return zahl;
    }
    
    int main()
    {
        char string[100];
        int zahl;
    
        string_eingeben(string);
        zahl = my_atoi(string);
    
        printf("my_atoi: int-Zahl = %i\n", zahl);
    
    return 0;
    }
    

    Wie geht das jetzt mit weiterzählen der Elemente bei einem als pointer übergegebenen String?



  • bandchef schrieb:

    Code mit zusätzlichem + als Vorzeichen:

    if((*string == ' ') || (*string == '+'))
    	{
    		sign = +1;
            ++string;
    	}
    

    Das geht so nicht. Die Leerzeichen hast du vorher schon alle aussortiert. Dein Zeichen kann entweder nur eine Zahl oder ein Plus sein. Bei einer Zahl darfst du den Zeiger dann auch nicht erhöhen, weil du sie sonst aus der Konvertierung nimmst.

    bandchef schrieb:

    Wie geht das jetzt mit weiterzählen der Elemente bei einem als pointer übergegebenen String?

    Was willst du machen? Ein inkrementieren eines Zeiger zeigt immer auf das nächste Element. Start und Ende des Speicherbereiches musst du dir dabei selber merken. Der Inhalt eines Strings ist ab dem abschließenden Nullzeichen ungültig.



  • Das ++string entspricht dem string = string + 1;

    Das *string = *string + 1; entspricht string[0] += 1;

    Du hast nur geschrieben geht nicht. Wie hat sich das geäußert?

    Du kannst das nur bei *char string machen, aber nicht bei char string[]

    Bei deinem my_atoi geht auch -+4711 (+-4711 geht nicht)



  • Wegen der Frage mit den Pointern..
    http://www.peacesoftware.de/ckurs12.html
    Find ich ganz nett erklärt 😉



  • Bei deinem my_atoi geht auch -+4711 (+-4711 geht nicht)

    Das +-4711 geht jetzt jedenfalls.

    Das geht so nicht. Die Leerzeichen hast du vorher schon alle aussortiert. Dein Zeichen kann entweder nur eine Zahl oder ein Plus sein. Bei einer Zahl darfst du den Zeiger dann auch nicht erhöhen, weil du sie sonst aus der Konvertierung nimmst.

    Ich denke das Problem ist jetzt soweit auch gelöst. Schaut euch den Code doch nochmal kurz durch. Ich meine, dass der jetzt soweit funktionieren sollte!

    Die Erklärungskurs zu den Pointern war in der Tat gut erklärt. Hab ich mir aufmerksam durchgelesen. Danke!

    #include<stdio.h>
    
    char* string_eingeben(char *string)
    {
    	int i = 0;
    	char zeichen;
    	zeichen = getchar();
    
    	while(zeichen != '\n')
    	{
    		*string = zeichen;
    		zeichen = getchar();
    		++string;
    	}
    	*string = '\0';
    
    	return string;
    }
    
    int my_atoi(char *string)
    {
    	int i = 0, zahl = 0, sign = 1;
    
    	while(*string == ' ' || *string == '\t')
    	{
    		++string;
    	}
    
        if((*string == '+') || (*string == '-'))
    	{
    		sign = -1;
    		++string;
    	}
    
        if((*string == '+') || (*string == '-'))
    	{
    		sign = -1;
    		++string;
    	}
    
    	while(*string != '\0' && *string >= '0' && *string <= '9')
    	{
    		zahl = zahl * 10;
    		zahl = zahl + (*string - '0');
    		++string;
    	}
    	zahl = zahl * sign;
    	return zahl;
    }
    
    int main()
    {
    	char string[100];
    	int zahl;
    
    	string_eingeben(string);
    	zahl = my_atoi(string);
    
    	printf("my_atoi: int-Zahl = %i\n", zahl);
    
    system("pause");
    return 0;
    }
    

  • Mod

    Und was kommt bei +1 heraus?

    Außerdem zeigt vieles an deinem Code, dass du ihn nicht wirklich verstanden hast, sondern bloß ein paar Codefetzen aus diesem Thread aneinandergehängt hast bis es funktioniert hat. Dazu folgende weise Worte:

    c.rackwitz schrieb:

    Wenn du selber Code schreibst, musst du ihn auch verstehen. Code ist kein Haufen von wahllos zusammengeschmissenen Buchstaben und Zeichen, Code ist Logik pur. Du musst genau wissen, warum du wo und welches Zeichen setzt.

    Nimm dir das mal zu Herzen - du hast es dringend nötig.



  • Und was kommt bei +1 heraus?

    Jetzt geht auch die +1.

    #include<stdio.h>
    
    char* string_eingeben(char *string)
    {
    	int i = 0;
    	char zeichen;
    	zeichen = getchar();
    
    	while(zeichen != '\n')
    	{
    		*string = zeichen;
    		zeichen = getchar();
    		++string;
    	}
    	*string = '\0';
    
    	return string;
    }
    
    int my_atoi(char *string)
    {
    	int i = 0, zahl = 0, sign = 1;
    
    	while(*string == ' ' || *string == '\t')
    	{
    		++string;
    	}
    
        if(*string == '+')
    	{
            sign = 1;
            ++string;
            if(*string == '-')
            {
                sign = -1;
    		    ++string;
            }
    	}
    
        if(*string == '-')
    	{
            sign = -1;
            ++string;
            if(*string == '+')
            {
                sign = -1;
    		    ++string;
            }
    	}
    
    	while(*string != '\0' && *string >= '0' && *string <= '9')
    	{
    		zahl = zahl * 10;
    		zahl = zahl + (*string - '0');
    		++string;
    	}
    	zahl = zahl * sign;
    	return zahl;
    }
    
    int main()
    {
    	char string[100];
    	int zahl;
    
    	string_eingeben(string);
    	zahl = my_atoi(string);
    
    	printf("my_atoi: int-Zahl = %i\n", zahl);
    
    system("pause");
    return 0;
    }
    


  • Und was ist mit +-+ oder -+- oder +-+- etc.?

    while(*string == ' ' || *string == '\t' || *string == '+' || *string == '-')
        {
            if(*string == '+')
                sign = 1;
    
            if(*string == '-')
                sign = -1;
    
            ++string;
        }
    

    Da kannst du dir 20 Zeilen Code sparen.



  • Das ist doch Unsinn, eine Zahl hat ein oder kein Vorzeichen und nicht n. Außerdem würdest du bei deinem Code bei -+3 das Vorzeichen falsch aufheben. An sich finde ich das überspringen der Whitespaces schon grenzwertig, aber okay. Eine gescheite atoi-Funtkion hat nur Ganzzahlen als Argument zu akzeptieren und sonst einen Fehler zu bringen und sollte nicht Alternativ irgendwas machen. Whitespaces sind dabei akzeptabel, damit man Eingabefunktionen eleganter umsetzen kann. Auch ein Punkt für eine Fließkommazahl ist okay, wobei man dann natürlich nur den Ganzzahligen Teil nimmt, sprich am Punkt endet. Schön wäre es noch wenn die Funktion testen würde, ob der String überhaupt eine Zahl ist. Für einen sinnvollen Test sollte man hier auch Fließkommazahlen zulassen, die das ganze schon wieder etwas komplexer machen. Ein einfacher Test, ob sich nur Ganzzahlen im String befinden lässt sich aber relativ leicht jetzt schon einbauen.



  • bandchef schrieb:

    DirkB schrieb:

    Bei deinem my_atoi geht auch -+4711 (+-4711 geht nicht)

    Das +-4711 geht jetzt jedenfalls.

    Da ist ein BUG kein Feature. Ein Zahl hat EIN Vorzeichen (und das kann auch + sein).

    atoi sollte alle Zahlen lesen können die printf bei %d erzeugt. (Auch bei"%+12d")


Anmelden zum Antworten