Problem mit Char(-array) und Integer
-
Hallo,
Ich habe ein Problem, mit einem Programm.
Und zwar, will ich aus einem Chararray (heißt im Code: string):strcpy(string, argv[2]);
zwei Zahlen entnehmen und zu einem Integer "machen".
Also in der Art:
string[12] = 1
string[13] = 2
=>
Integer = 12Mein versuch war es in der Funktion "birthday":
int birthday(char s[], char c){ int day, month, year; if(c == 'd'){ day = s[15]; day = day*10; day = day + s[16]; return day; }
Das Ergebnis ist dann aber Falsch (ich habe so des Verdacht, das der mir in day immer den ASCII Code schreibt...).
Ich habe auch schon sämtliche atoi Funktionen ausprobiert, z.b. so:char *s1; char s2[2]; s2 = s[15]+s[16]; s1 = &s2; day = atoi(s1);
Das mit dem s1 habe ich nur dazu geschrieben, weil atoi(s2) nicht geht (Fehler falscher typ ist char muss *char).
Über einen Tipp wäre ich sehr dankbar.
-
Im String stehen die Zeichen '0' bis '9' (wenn dein System ASCII oder verwandte Systeme verwendet, 48 - 57). Von Hand kannst du das ganze so verrechnen:
int day = (s[15] - '0') * 10 + s[16] - '0';
Was das Ausschneiden des Teilstrings angeht, s[15] + s[16] hängt nicht zwei Zeichen aneinander, sondern addiert ihre Werte. In deinem speziellen Fall könnte man etwa
char s2[3] = { s[15], s[16], '\0' }; /* Null-Terminator nicht vergessen! */ int day = atoi(s2);
schreiben. Eine generische Lösung wäre beispielsweise
char *substr(char *dest, char *src, size_t pos, size_t len) { strncpy(dest, src + pos, len); dest[len] = '\0'; return dest; }
...wobei dann wichtig ist, dass in dest mindestens len + 1 Zeichen passen. Zu benutzen etwa so:
char buf[3]; int day = atoi(substr(buf, s, 15, 2));
Abhängig davon, was in s genau drinsteht, ginge aber vielleicht auch
int day = atoi(s + 15);
nämlich dann, wenn du sicher bist, dass s[17] keine Ziffer ist.
-
Danke,
Nur noch eine kurze Frage, du schreibst, das der erste Fall nur für Systeme gilt auf denen ASCII verwendet wird, gibt es denn auch andere die das nicht verwenden?
Bei mir geht es auf jeden Fall jetzt.
Die Zweite Lösung finde ich auch gut, aber die letzte kapiere ich irgendwie nicht.
MfG,
Fer
-
Der Standard garantiert, dass die Zeichen '0' bis '9' aufeinander folgende numerische Werte haben, der Code funktioniert also überall. Es ist aber nicht garantiert, dass '0' den Wert 48 hat, und es ist auch nicht überall der Fall - beispielsweise gibt es IBM-Mainframes, auf denen EBCDIC üblich ist; dort ist '0' == 240 und '9' == 249.
-
Danke, wieder etwas gelernt^^.
PS: Wollte mich noch mal für die substr Funktion bedanken, alles was ich sonst im Netz gefunden habe, hatten mindestens 20 Zeilen.
MfG