Array mit char-Werten in int-Werte konvertieren
-
Hallo,
Ich habe einen 10 stelligen char Array mit Zahlenwerten. Nun möchte ich aus jedem Wertepaar einen Int-Wert generieren. Das heisst aus einer [1][2] möchte ich eine 12 machen usw.
Im gesamten ergeben sich aus 10 Zeichen dann 5 Int-Werte.Kann mir jemand helfen wie ich dieses Problem lösen kann? Ich habe alles mögliche versucht, komme aber zu keinem Resultat.
Vielen Dank für jeden Tip!
Gruß,
Andre Maus
-
versuche es mal mit der guten alten c-Fkt atoi (bedeutet AsciiToInteger) int atoi(const char *);
ohne Gewähr:int i = atoi(c[0])*10 + atoi(c[1]);
-
Du möchtest also dass die Zeichen '1' und '2' zu 12 Verknüpft werden? Dann mach doch einfach:
int AnfangDerZahlen=static_cast<int>('0'); char CharFeld[10]; //Jetzt das CharFeld füllen int IntFeld[5]; int AnfangDerZahlen=static_cast<int>('0'); for(int i=0;i<10;i+2) { IntFeld[i/2]=10*(CharFeld[i]-AnfangDerZahlen)+(CharFeld[i+1]-AnfangDerZahlen); }
-
Hi!
Hmmm...Meinst du vielleicht dies?:
char x[10] = { /*10 Werte*/ }; int save[5]; for(int i=0, hlp=0; i<10; ++i, ++hlp) savex[hlp] = atoi(x[i]) * 10 + atoi(x[++i]);
EDIT: atoi eingefügt, weil ich eben erst gesehen habe das es um char geht.
EDIT2: Bin mir gerade nicht sicher und kann leider nicht nachsehen, aber wie sicher kann ich mir sein das x[i] VOR x[++i] ausgewertet wird? Ansonsten wäre wohl i+1 und i+=2 die bessere bzw. sicherere Lösung.Code-Hacker
-
Code-Hacker schrieb:
EDIT2: Bin mir gerade nicht sicher und kann leider nicht nachsehen, aber wie sicher kann ich mir sein das x[i] VOR x[++i] ausgewertet wird? Ansonsten wäre wohl i+1 und i+=2 die bessere bzw. sicherere Lösung.
fein.
sequence points, also punkte, an denen sichergestellt ist, daß der eine teil vor dem anderen teil ausgewertet wird, sind nur ganz grobe sachen wie der kommaoperator oder &&. nichmal zuweisungen sind sequence points.
-
erstmal danke für die guten Tips! Wenn ich jedoch mal testweise
char c[1] = {'1'};
int hlp = 0;
hlp = atoi(x[0]);ausführe, bekomme ich eine Compilermeldung: illegal pointer conversion in bezug auf atoi().
???
-
@volkard: ergo lautet das Motto: sicher ist sicher?
Hätte ich auch gesagt, obwohl es doch eigentlich nach dem Standard (ich dachte übrigens, daß die Prioritäten dort 100%ig festgelegt sind -> wohl getäuscht) auf Code-Hackers' Weise richtig ist, oder?
-
es muss natürlich:
char c[1] = {'1'};
int hlp = 0;
hlp = atoi(c[0]);heissen
-
andre.maus schrieb:
es muss natürlich:
char c[1] = {'1'};
int hlp = 0;
hlp = atoi(c[0]);heissen
Ich denke nicht.
const char* != char
-
char c[1] = {'1'};
int hlp = 0;
hlp = atoi(c[0]);wie kann es denn hier zu einer illegal pointer conversion kommen?
Liegt es evtl. an meiner Entwicklungsumgebung? yVision2 für yController?Gruß,
Andre
-
Andre Maus schrieb:
char c[1] = {'1'};
int hlp = 0;
hlp = atoi(c[0]);wie kann es denn hier zu einer illegal pointer conversion kommen?
Liegt es evtl. an meiner Entwicklungsumgebung? yVision2 für yController?Gruß,
AndreKlar, im Zweifelsfalle liegt es immer am Compiler
In meinem letzten Posting habe ich bereits alles relevante gesagt:
Die Funktion erwartet einen char* und du übergibst ihr einen char...
-
achso,
mal anders gefragt. gibt es denn nicht eine Funktion wie atoi() die sich
auf char anwenden lässt, statt auf const * char ?
-
unschön, aber der Vollständigkeit halber und wie immer ohne Gewähr
char c='2'; int i = (int)c - (int)'0';
@deadlef: thx' für diese oft genannte Antwort...
1st edit: ''vergessen;-((
-
Du brauchst deinen Char nur ein Const hinzu zu casten:
char Zeichen; int Ganzzahl; Ganzzahl=atoi(const_cast<const char*>(&Zeichen));
So geht's.
-
Nein, tut es nicht. atoi erwartet einen nullterminierten C-String, und auf der Suche nach der Null wird atoi hinter &Zeichen nichts finden (außer undefiniertem Verhalten). Davon abgesehen muss man ein const nicht dazucasten.
freshmans Lösung ist doch schick und sogar portabel, weil der Standard garantiert, dass '0' bis '9' hintereinander liegen. Die (int)-Casts braucht man nicht einmal.
Aber BTW, was soll das ' hinter thx? Da wird doch nichts dahinter weggeschnitten... stört irgendwie den Lesefluss</OT und IMHO>
-
operator void schrieb:
Aber BTW, was soll das ' hinter thx? Da wird doch nichts dahinter weggeschnitten... stört irgendwie den Lesefluss
</OT und IMHO>
-
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