string in int umwandeln ohne Verwendung von stoi



  • Einmal mehr ein freundliches Hallo an alle 😄

    Mein schlaues Lehrbuch verlangt nun von mir die Konvertierung eines strings in eine
    Integerzahl. Ums kurz zu machen hab ich mir nach 4h Knobelei die Lösung angeschaut und wäre da niemals von selbst drauf gekommen !

    Das Buch welches ich durcharbeite heißt "Der C++ Programmierer" und wurde überall als "DAS BESTE DEUTSCHSPRACHIGE BUCH" zum C++ lernen angepriesen.
    Kotlin und Python beherrsche ich bereits und habe selbst schon so einige Apps in Kotlin und Automationsprogramme in Python geschrieben. Aber ganz erlich, die Aufgaben dieses Buches lassen mich ernsthaft an mir zweifeln weshalb ich begleitend dazu das Buch "Grundkurs Informatik-Grundlagen und Konzepte für die erfolgreiche IT-Praxis - Eine umfassende praxisorientierte Einführung" durcharbeite um ein besseres Verständnis für die Programmierung und Aufgaben in der IT generell zu bekommen. Ich bin Hobbyist und habe nicht vor in der IT zu arbeiten, habe aber viel Freude daran mich weiterzubilden und an der Programmierung im Allgemeinen.

    Ich schreibe das jetzt bewusst dazu weil mich (wie bereits angesprochen oben) dieses Buch bzw die Aufgaben darin teilweise komplett überfordern ! Oft wirken die Aufgaben recht simpel, dann macht man sich ans Werk und bemerkt nach einiger Zeit das man nicht voran kommt, schaut sich die Lösung an und ist noch ratloser als zuvor .....

    Um aber jetzt mal zurück zur Aufgabe zu kommen hier also die präsentierte Lösung:

    int main() {
      const string str{"17462309"};  // aus Aufgabentext
      long int z = 0L;
      for (auto zeichen : str) {
        z *= 10;
        z += static_cast<int>(zeichen) - static_cast<int>('0');
      }
    

    Frage 1: Wieso muss ich z *= 10 rechnen ?
    Frage 2: Warum ist - static_cast<int>('0'); notwendig, das wurde leider nirgendwo in irgendeiner Weise beschrieben und erschließt sich mir auch in keinster Weise...


  • Mod

    1. Weil so das Dezimalsystem funktioniert? Du verstehst schon die Idee am Rechenweg, oder nicht? Was hättest du stattdessen erwartet?
    2. Hier muss man gar nichts casten. z += zeichen - '0'; hätte exakt die gleiche Bedeutung. Ist vermutlich anfängerfreundlich gedacht, dass man es so ausschreibt, als ob die Zeichen in Zahlen umgewandelt werden, damit deutlicher ist, was hier die Idee ist. Schaden tut es jedenfalls auch nichts (es ist wirklich exakt gleich), außer dass es mit der Anfängerfreundlichkeit offensichtlich nicht funktioniert hat, da du ja noch Fragen hast.
      (In Wirklichkeit sind die Zeichen auch Zahlen, weshalb es auch ohne den Cast funktioniert. Aber dann müsste man halt viel weiter ausholen, wie und warum Zeichen trotzdem wie Zeichen funktionieren, wenn es doch Zahlen sind. Etwas, das ich selber an dieser Stelle nicht erklären werde)


  • @OwnliE
    Durch das * 10 wird bisher geparste Zahl um eine "Position" weiter geschoben.

    Durch den Cast nach int wird das aktuelle Zeichen in seinen Integer Wert der ASCII Tabelle gecastet. Da 0-9 dort hintereinander stehen, kann man den ASCII Wert von 0 (der ist 48) abziehen und bekommt den Zahlenwert.

    Am Anfang der Schleife ist z = 0. Also passiert nichts.
    In Zeichen steht eine "1". Durch die casts haben wir dann z += 49 - 48 => z = 0 + 49 - 48 =1.

    Im zweiten Durchlauf steht in zeichen eine 7.
    in z steht die 1 aus dem ersten durchgang. z*=10 => z = 1 * 10 = 10.
    Die casts und die Addition ergeben dann:
    z+= 55-48 => z = 10 + 55-48 = 17
    und so weiter.



  • Danke dir erstmal für die schnelle Antwort. Ja offensichtlich scheine ich hier was Grundlegendes schlichtweg nicht zu kennen weshalb ich ja wie bereits erwähnt noch ein anderes Buch nebenher durcharbeite werlches mir schon so manchmal ne Antwort geliefert hat die mir die Erleuchtung brachte. Das Zeichen durch Zahlen respräsentiert werden habe ich lediglich irgendwo mal aufgeschnappt aber im Buch selbst ist davon bislang leider noch nichts zu lesen gewesen weshalb mich die Aufgabe als solche irgendwie verwundert da es als Anfängerbuch deklariert ist, ein Anfänger das aber so definitiv nicht lösen kann.

    Durch deine Erläuterung macht wenigstens der Rechenweg jetzt einen Sinn und ich weiß schonmal wie sich das Ganze aufbaut 👍🏻


  • Mod

    @OwnliE sagte in string in int umwandeln ohne Verwendung von stoi:

    aber im Buch selbst ist davon bislang leider noch nichts zu lesen gewesen weshalb mich die Aufgabe als solche irgendwie verwundert da es als Anfängerbuch deklariert ist, ein Anfänger das aber so definitiv nicht lösen kann.

    ??? Die Musterlösung setzt doch dieses Wissen gerade nicht voraus!



  • @OwnliE sagte in string in int umwandeln ohne Verwendung von stoi:

    Das Zeichen durch Zahlen respräsentiert werden habe ich lediglich irgendwo mal aufgeschnappt

    Was meinst du denn, wie Computer arbeiten. Die kennen nur Zahlen.

    Alles Andere ist Interpretation der Zahlen. Als Befehl haben die eine andere Bedeutung als ein Zeichen oder Farbcodierung oder ...



  • @DirkB Nene schon Zahlen da hab ich mit dumm ausgedrückt, ich meinte im Grunde das mir die Berechnung dahinter nicht ganz klar war aber wurde ja bereits Erläutert ^^



  • Hier nochmal "richtig(er)":

    #include <iostream>
    #include <string>
    
    int main() {
      const std::string str{"17462309"};  // aus Aufgabentext
      long int z = 0L;
      for (auto zeichen : str) {
        z *= 10;
        z += (zeichen - '0');
      }
      std::cout << z;
      return 0;
    }
    


  • @Schlangenmensch Vielen Dank genau nach so einer Erklärung hatte ich die ganze Zeit gesucht jetzt machts total Sinn 😅


Log in to reply