Array mit char-Werten in int-Werte konvertieren



  • 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ß,
    Andre

    Klar, 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



  • 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. 😉


Anmelden zum Antworten