Bibliotheksfunktion atoi?
-
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; }
-
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")