Umwandlungsproblem



  • Ich verstehe echt nicht so ganz, wie man das nicht verstehen kann.

    Du hast doch selber schon die i-te Ziffer als string gefunden.
    Wolltest diese aber einem 'int' zuweisen, was nicht direkt geht.
    Daher mein Hinweis, dass du dir std::stoi mal ansehen solltest.

    So, und jetzt noch 1 & 1 zusammen rechnen...

    Indizes fangen in C++ übrigens bei 0 an.



  • Belli schrieb:

    Ersetze

    pb = s.substr(Nummer,1);
    

    durch

    pb = s[Nummer];
    

    Dann bleibt bp immer 0 ... ist also falsch ...



  • Jockelx schrieb:

    Ich verstehe echt nicht so ganz, wie man das nicht verstehen kann.

    Du hast doch selber schon die i-te Ziffer als string gefunden.
    Wolltest diese aber einem 'int' zuweisen, was nicht direkt geht.
    Daher mein Hinweis, dass du dir std::stoi mal ansehen solltest.

    So, und jetzt noch 1 & 1 zusammen rechnen...

    Indizes fangen in C++ übrigens bei 0 an.

    weis ich, aber ich kann doch da nicht Nummer hinschreiben, weil ich doch gar nicht die Nummer dort haben will, sondern die Ziffer, die an der benummerten Stelle in der Zahl steht ... Nummer und Zahl und Ziffer sind je etwas Getrenntes .....



  • Naja, ich sehe jetzt erst, dass Deine ganze Schleife Schrott ist, mach das mal so:

    ...
    
              vector<int>Zifferncontainer;
              for (Nummer = 0; Nummer < s.size(); Nummer++);
              {
                 pb = s[Nummer];
                  Zifferncontainer.push_back(pb);
                  cout<<pb<<" pb "<<endl;
    


  • Meine Güte...

    pb = std::stoi(s.substr(Nummer,1));
    

    otto56 schrieb:

    Belli schrieb:

    Ersetze

    pb = s.substr(Nummer,1);
    

    durch

    pb = s[Nummer];
    

    Dann bleibt bp immer 0 ... ist also falsch ...

    0?
    Ich finde den Tipp zwar auch nicht gut, aber pb sollte Werte zwischen 49-59 (oder so ungefähr) haben



  • Jockelx schrieb:

    Ich finde den Tipp zwar auch nicht gut, aber pb sollte Werte zwischen 49-59 (oder so ungefähr) haben

    Wahrscheinlich hat er einstellige Eingabezahlen und dann kommt halt Schrott raus, weil er mit dem Index 1 beginnt.
    Was gefällt Dir an dem Tipp nicht?



  • Du suggerierst, dass das

    std::string s= "123";
    	int i = s[1];
    
    	std::cout << i;
    

    2 ausgeben würde. Deshalb finde ich den Tipp nicht gut.



  • Jetzt machst Du mich unsicher, ob das nicht genau das wäre, was der TE möchte 🙂
    Bisher war ich nämlich der Meinung, er will den ASCII - Code ... 😕



  • Also, ich poste mal meinen ganzen Code... wie gesagt, nicht meckern, ich bin Anfänger ...

    #include <stdio.h>
    #include <string.h>
    #include <iostream>
    using namespace std;
    #include <sstream>
    #include <string>
    #include <vector>
    
    string s;
    int Nummer;
    int pb;
    int input;
    
        int main (void)
     {
        for (int zahl =1; zahl<=1001;zahl++)
          {
                string s = to_string(zahl); // int in String
                //cout << s << endl;
    
            cout<<zahl<<" ist "<<s.length()<<" Ziffern lang"<<endl;
    
              int Länge = s.length();// string in int
    
              //cout<<"Länge=" << Länge << endl;
              vector<int>Zifferncontainer(Länge);
              for (Nummer=1; Nummer<=Länge;Nummer++);
              {
                  int input =s[Nummer];
                  //int input = std::stoi("5");
                  Zifferncontainer.push_back(input);
                  cout<<input<<" input "<<endl;
              }
    
          }
    
        }
    

    es geht schon um Zahlen beliebiger Länge, aber mir reicht int.
    1. zuerst Zahl bilden
    2. Länge feststellen
    3. in einen Container die einzelnen Ziffern packen ... damit er sie wieder ausspucken kann einzeln ..

    Das ist die Aufgabe, die ich mir gestellt habe.

    die ganzen cout's sind nur Hilfscouts, damit überprüf ich, die fliegen zum Schluß raus ...



  • Jockelx schrieb:

    Du suggerierst, dass das

    std::string s= "123";
    	int i = s[1];
     
    	std::cout << i;
    

    2 ausgeben würde. Deshalb finde ich den Tipp nicht gut.

    ich möchte schon, daß er bei 1 1 ausgibt und bei 2 2 . ich hab je die Realnummern, obwohl ich weiß, daß die Zählung mit 0 beginnt. also der erste Eintrag die Nummer 0 hat. Aber wir sind ja noch nicht bei der Ausgabe...



  • Jockelx schrieb:

    Meine Güte...

    pb = std::stoi(s.substr(Nummer,1));
    

    Dann bleibt bp immer 0 ... ist also falsch ...[/quote]

    0?
    Ich finde den Tipp zwar auch nicht gut, aber pb sollte Werte zwischen 49-59 (oder so ungefähr) haben[/quote]

    Damit macht er das:

    1 ist 1 Ziffern lang
    libc++abi.dylib: terminating with uncaught exception of type std::out_of_range: basic_string
    (lldb) Das kann ich nicht deuten ....



  • otto56 schrieb:

    ich möchte schon, daß er bei 1 1 ausgibt und bei 2 2 .

    Dann mach halt so, wie Jockelx vorschlug mit stoi, oder folgendes:

    vector<int>Zifferncontainer;
              for (Nummer = 0; Nummer < s.size(); Nummer++);
              {
                 pb = s[Nummer] - '0';
                  Zifferncontainer.push_back(pb);
                  cout<<pb<<" pb "<<endl;
    


  • otto56 schrieb:

    libc++abi.dylib: terminating with uncaught exception of type std::out_of_range: basic_string
    (lldb) Das kann ich nicht deuten ....

    Jockelx schrieb:

    Indizes fangen in C++ übrigens bei 0 an.

    Belli schrieb:

    Naja, ich sehe jetzt erst, dass Deine ganze Schleife Schrott ist,



  • Belli schrieb:

    otto56 schrieb:

    ich möchte schon, daß er bei 1 1 ausgibt und bei 2 2 .

    Dann mach halt so, wie Jockelx vorschlug mit stoi, oder folgendes:

    vector<int>Zifferncontainer;
              for (Nummer = 0; Nummer < s.size(); Nummer++);
              {
                 pb = s[Nummer] - '0';
                  Zifferncontainer.push_back(pb);
                  cout<<pb<<" pb "<<endl;
    

    Das kann ich mir jetzt gar nicht deuten. So ist der cout:

    9 ist 1 Ziffern lang
    -48 pb
    10 ist 2 Ziffern lang
    -48 pb
    11 ist 2 Ziffern lang
    -48 pb

    wieso 48?



  • Zeig mal dein komplettes Programm. Du hattest da noch ein paar globale Variablen,
    die auch noch genau so heissen, wie lokale ('s').
    Ich denke da ist was durcheinander geraten.



  • Jockelx schrieb:

    Zeig mal dein komplettes Programm.

    Es ist jetzt etwas chaotisch ....

    #include <stdio.h>
    #include <string.h>
    #include <iostream>
    using namespace std;
    #include <sstream>
    #include <string>
    #include <vector>
    
    string s;
    int Nummer;
    int pb;
    int input;
    
        int main (void)
     {
        for (int zahl =1; zahl<=101;zahl++)
          {
                string s = to_string(zahl); // int in String
                //cout << s << endl;
    
            cout<<zahl<<" ist "<<s.length()<<" Ziffern lang"<<endl;
    
              int Länge = s.length();// string in int
    
              //cout<<"Länge=" << Länge << endl;
              //vector<int>Zifferncontainer(Länge);
            /*  for (Nummer=1; Nummer<=Länge-1;Nummer++);
              {
                  cout<<Nummer<<" Nummer";
                 //int input = std::stoi(s.substr(Nummer,1));
                  //int input =s[Nummer];
                  int input = std::stoi("5");
                  Zifferncontainer.push_back(input);
                  cout<<" "<<input<<" input "<<endl;
            } */
              vector<int>Zifferncontainer;
              for (Nummer = 0; Nummer < s.size(); Nummer++);
              {
                  pb = s[Nummer] - '0';
                  Zifferncontainer.push_back(pb);
                  cout<<pb<<" pb "<<endl;
          }}
    
        }
    


  • Was soll das denn:

    pb = s[Nummer] - '0';
    


  • otto56 schrieb:

    Jockelx schrieb:

    Zeig mal dein komplettes Programm.

    Es ist jetzt etwas chaotisch ....

    Richtig.

    otto56 schrieb:

    #include <stdio.h>
    #include <string.h>
    #include <iostream>
    using namespace std;
    #include <sstream>
    #include <string>
    #include <vector>
    
    string s;
    int Nummer;
    int pb;
    int input;
    
        
        
        int main (void)
     {
        for (int zahl =1; zahl<=101;zahl++)
          {
                string s = to_string(zahl); // int in String
                //cout << s << endl;
              
            cout<<zahl<<" ist "<<s.length()<<" Ziffern lang"<<endl;
          
              int Länge = s.length();// string in int
    
              //cout<<"Länge=" << Länge << endl;
              //vector<int>Zifferncontainer(Länge);
            /*  for (Nummer=1; Nummer<=Länge-1;Nummer++);
              {
                  cout<<Nummer<<" Nummer";
                 //int input = std::stoi(s.substr(Nummer,1));
                  //int input =s[Nummer];
                  int input = std::stoi("5");
                  Zifferncontainer.push_back(input);
                  cout<<" "<<input<<" input "<<endl;
            } */
              vector<int>Zifferncontainer;
              for (Nummer = 0; Nummer < s.size(); Nummer++);  // <---   dieser Strichpunkt muß weg
              {
                  pb = s[Nummer] - '0';
                  Zifferncontainer.push_back(pb);
                  cout<<pb<<" pb "<<endl;
          }}
         
        }
    

    VG



  • Schlangenmensch schrieb:

    Was soll das denn:

    pb = s[Nummer] - '0';
    

    Damit bekommst Du den Wert eines Ziffernzeichens in einen int
    '0' -> 0
    '1' -> 1
    etc.

    Das funktioniert weil "zufällig" die Ziffern in der ASCII Tabelle in der richtigen Reihenfolge hintereinander stehen.

    VG



  • Hab nur gedacht, der Dezimalwert von '0' ist 48 nach ASCII Tabelle. Und da die Ausgabe -48 ist kam mir das verdächtig vor.


Anmelden zum Antworten