Array mit char-Werten in int-Werte konvertieren



  • 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 warnung

    g++ schrieb:

    main.cc:12: error: Initialisierungs-Zeichenkette für char-Feld ist zu lang


Anmelden zum Antworten