Array mit char-Werten in int-Werte konvertieren
-
freshman schrieb:
operator void schrieb:
Aber BTW, was soll das ' hinter thx? Da wird doch nichts dahinter weggeschnitten... stört irgendwie den Lesefluss
</OT und IMHO>
Na das hier:
@deadlef: thx' für diese oft genannte Antwort...
Ich übersetz es mal für dich: Das ' nach dem thx is fürn Arsch!
-
thx' ist verwirrend. Was gehört denn nun den thx?
-
Also ich hatte mal son ähnliches Problem.
Ich habs so gelöst
char[] = '12'; int i; i = ((c[1]-48)*10)+((c[0]-48)*1);
Erklärung:
wenn c[0] = '1' und c[1] = '2'
dann ist c[0] = 49dezimal
und 49 - 48 = 1
1 * 10 = 10
und genau so ist das mit c[1] auch.
Jedenfalls hats bei mir geklappt.
Bitte bombt mich jetzt nicht zu weil die lösung für euch zu blöd ist oder so.
Das ist mir nämlich schon mal passiert.
Bin noch anfänger.
-
Herzlichen Dank für Eure kompetenten Antworten.
Ich habe mich für freshmans Lösung entschieden, da mir dessen Implementierung am Einfachsten erschien.
Wenn ich nun zwei char-array-Paare als int-Wert zusammensetze gehe ich wie folgt vor:char c[2] = {'1', '2'}; int i = (((int)c[0] - (int)'0') * 10) + ((int)c[1] - (int)'0');
Der Inhalt von i ist somit 12.
Wunderbar und wie erwartet!Aber noch eine Frage hätte ich da (der Verständlichkeit halber): Wozu muss ich von jedem c[]-Wert noch (int)'0' subtrahieren?
Gruß,
Andre
-
Das ich anfänger bin weißt du ja.
Also ich weiß nur das:
ne 0 den dezimalen wert 48 hat. Denn laut ANSI oder ASCII hat die 0 den dezimalen wert 48, die 1 den wert 49 usw.
Ich kann mir das nur so erklären das wenn in c[0] ne '1' steht, also 49 der Integer wert ((int)'0') der '0' also 48 abgezogen. und somit kommst du auf 1.
alse steht dann in deiner Integer Variable ne 1.Das ist genauso wie meine Variante. Guck mal eins weiter oben.
nur das ich für (int)'0' ne 48 geschrieben habe.
-
Ich fand meine erklärung grad scheiße!
Nochmal:
ne 0 hat laut ANSI oder ASCII den dezimalen wert 48.
Bei dir stehen in c[0] ne 1 und in c[1] ne 2.
Wenn du jetzt schreibst:
(int)c[0]
wandelt dein Rechner die 1 in c[0] in einen dezimalen wert um, Also ne 49.
wenn du jetzt noch "- (int)'0'" ranfügst. Dann macht dein Rechner aus der 0 den dezimalen wert 48.
jetzt heißt es:
(int)c[0] - (int)'0'
Also: 49 - 48
Ergebnis: 1
Das selbe passiert mit der 2 in c[1].
Nochmal grob:
Deine Formel:
i = ((int)c[0] - (int)'0' * 10)+((int)c[1] - (int)'0' * 1);
Für deinen Rechner steht da:
i = ( 49 - 48 * 10)+( 50 - 48 * 1);
und da kommt 12 raus.Hoffe die Erklärung ist besser.
-
Sorry nochmal.
Hab die Klammern vergessen.
Nochmal die beiden Formeln:char c[] = {1,2}; int i = (((int)c[0] - (int)'0') * 10) + ((int)c[1] - (int)'0');
Für deinen Rechner:
int i = ((49 - 48) * 10) + ( 50 - 48);
und das ist 12.
So ich glaub jetzt habe ich alle meine fehler behoben.
-
Du kannst deine Beiträge editieren. Oben rechts in der Ecke deines Posts. Du musst nur eingeloggt sein. Das spart das ganze doppel und dreifachposten.
-
klingt sehr einleuchtend!
Vielen Dank und schönes Wochenende (an alle Poster!).
Gruß,
Andre
-
Danke Nimda.
Das wusste ich nicht.
Bin noch nicht so lange hier im Forum.
-
Hi!
Nimda schrieb:
Du brauchst deinen Char nur ein Const hinzu zu casten:
char Zeichen; int Ganzzahl; Ganzzahl=atoi(const_cast<const char*>(&Zeichen));
So geht's.
Wieso hinzucasten? Nach const wird doch ohnehin implizit gecastet. Nur nicht von const, es klapp also auch so:
char c[1] = "1"; int hlp = atoi(&c[0]);
Immerhin ist char* auch nur ein Pointer auf char. Also kann man dem einfach die Adresse übergeben.
Code-Hacker
-
probier mal
int main () { char a = '2'; char x = '4'; int i = atoi(&x); cout << i << endl; }
wird dir mancherorts seltsame ergebnisse bescheren
atoi will einen '\0' terminierten string, also:
const char *c = "42"; cout << atoi(c) << endl; //oder char x[2] = "1"; //um dein beispiel aufzugreifen- 2 zeichen platz machen! cout << atoi(x) << endl;
und dann tun es stringstreams auch (siehe aber auch die FAQs)
-
Hi!
Stimmt. Ich habe eben nachgesehen. Ich habe das verwendet um den String ab einer bestimmten Position umzuwandeln, dort klappt es nämlich. Also ist mein Beispiel ja nicht falsch, er ist ja 0-terminiert, immerhin ist an der nächsten Position, also c[1] die Endekennung.
Z.B. habe ich in einem String ein Komma gesucht, mir darauf den Zeiger zurückgeben lassen, um 1 erhöht (da dort die Zahl war) und dann mit diesem Zeiger atoi aufgerufen:
char* p = strchr(bla, ',')+1; // hoffe das ist so richtig, wenn nicht hoffentlich trotzdem verständlich :) int i = atoi(p);
Man könnte natürlich, wenn man weiß wo die Position ist, statt p auch &bla[komma] benutzen, das funktioniert dann wie von mir beschrieben.
Stringstreams kenne ich schon
Code-Hacker
-
Code-Hacker schrieb:
Also ist mein Beispiel ja nicht falsch, er ist ja 0-terminiert, immerhin ist an der nächsten Position, also c[1] die Endekennung.
c[1] gehört dir aber nicht
bei mir liefert z.b.int main () { char a = '2'; char b[1] = "4"; cout << atoi(b) << endl; }
als ausgabe 42.
kompiliert allerdings mit der warnungg++ schrieb:
main.cc:12: error: Initialisierungs-Zeichenkette für char-Feld ist zu lang