Zahlenstring umwandeln in ein Array of Int aus den Ziffern



  • Hallo,

    ich will aus einem tausendstelligen Ganzzahlstring einen Array of Int[1000] mit jeweils der entsprechenden Ziffer eingespeichert. Dazu habe ich mir folgendes Programm geschrieben:

    #include <iostream>
    
    using namespace std;
    
    int main ()
    {
    	char Feld[1001] = "73167176531330..."; // Die Zahl ist lang (1000 Ziffern)
    	int Zahlenfeld[1001];
    
    	for (int i = 0; i < 1001; i++) {
    		char c[1];
    		c[0] = Feld[i];
    		Zahlenfeld[i] = atoi(c);
    	}
    
    	for (int i = 0; i < 1001; i++)
    		cout << Zahlenfeld[i];
    
    }
    

    Die Ausgabe ist leider nicht meine Wünschen entsprechend. Ich bekomme eine sich oft wiederholende Zahlenreihe:

    1474836472147483647214748364721474836472147483647214748364
    

    und das über mehreren Seiten Terminalausgabe.

    Es wäre nett wenn ihr mir helfen könntet.

    Joachim



  • Eklig:

    char Feld[1001] = "73167176531330"; // Die Zahl ist lang (1000 Ziffern)
        int Zahlenfeld[1001];
    
    	for(int i = 0; i < 1001;i++)
    	{
    		Zahlenfeld[i] = static_cast<int>(Feld[i]) - static_cast<int>('0');
    	}
    
    	for(int i = 0; i < 1001;i++)
    	{
    		std::cout << Zahlenfeld[i];
    	}
    

    Gut:
    http://www.boost.org/doc/libs/1_35_0/libs/conversion/lexical_cast.htm



  • Oder einfach:

    for(int i = 0; i < 1001; ++i)
    {
         std::stringstream str;
         str << Feld[i];
         str >> Zahlenfeld[i];
    }
    


  • Oder (um sich das ständige konstruieren/destruieren zu sparen):

    std::stringstream sstream;
    
    for (int i = 0; i < 1001; i++) {
    	sstream.clear();
    	sstream << Feld[ i ];
    	sstream >> Zahlenfeld[ i ];
    }
    


  • David_pb schrieb:

    Oder (um sich das ständige konstruieren/destruieren zu sparen):

    std::stringstream sstream;
    
    for (int i = 0; i < 1001; i++) {
    	sstream.clear();
    	sstream << Feld[ i ];
    	sstream >> Zahlenfeld[ i ];
    }
    

    Eigentlich OK....

    Aber: Was passiert, wenn Feld mal was anderes als '0'...'9' enthält ?
    (Antwort: Nicht das richtige...)



  • bladerunner10 schrieb:

    Aber: Was passiert, wenn Feld mal was anderes als '0'...'9' enthält ?
    (Antwort: Nicht das richtige...)

    Da das aber nicht Inhalt der Fragestellung war muss man sich, wenn man nicht der Fragesteller selbst ist, dahingehend keinen Kopf drum machen, nicht?



  • David_pb schrieb:

    bladerunner10 schrieb:

    Aber: Was passiert, wenn Feld mal was anderes als '0'...'9' enthält ?
    (Antwort: Nicht das richtige...)

    Da das aber nicht Inhalt der Fragestellung war muss man sich, wenn man nicht der Fragesteller selbst ist, dahingehend keinen Kopf drum machen, nicht?

    Rüchtüg!

    Aber: Expect the unexpected



  • bladerunner10 schrieb:

    Aber: Expect the unexpected

    Sehr gute Einstellung! 😉 Aber man will ja auch möglichst simpel bleiben und keine überladenen Codemonster als Beispiel posten.
    Aber grundlegend hast du natürlich recht!



  • jo_arbeitet_an_Problem10 schrieb:

    #include <iostream>
    #include <exception>
    
    using namespace std;
    
    int main ()
    {
    	char Feld[1001] = "73167176531330..."; // Die Zahl ist lang (1000 Ziffern)
    	int Zahlenfeld[1001]; //warum 1001? willst du das terminierungs-Byte auch mit? aber ich habs ma so genommen um die felder mit ptr bequem durchzugehen ^^
    
    char *ptr_char = Feld;
    int * const last_int = Zahlenfeld[1000];
    	for (int *ptr (Zahlenfeld); ptr != last_int; ++ptr, ++ptr_char)
               {
                           *ptr = *ptr_char - '0'; //kommen halt komische Werte rein, wenn andere Buchstaben als 0...9 drin hat, deshalb _vll_ so:
                           switch (*ptr_char)
                             {
                               case '0': *ptr = 0; break;
                               case '1': *ptr = 1; break;
                               case '2': *ptr = 2; break;
                               case '3': *ptr = 3; break;
                               case '4': *ptr = 4; break;
                               case '5': *ptr = 5; break;
                               case '6': *ptr = 6; break;
                               case '7': *ptr = 7; break;
                               case '8': *ptr = 8; break;
                               case '9': *ptr = 9; break;
                               default: throw std::invalid_argument ("ungültiger string"); //kann mich mit invalid_argument auch irren - halt ich so gar für sehr wahrscheinlich ^^
                             }
    	}
    
    	for (int *i (Zahlenfeld); i != last_int; ++i)
    		cout << *i;
    
    }
    

    bb



  • jo_arbeitet_an_Problem10 schrieb:

    #include <iostream>
    
    using namespace std;
    
    int main ()
    {
    	char Feld[1001] = "73167176531330..."; // Die Zahl ist lang (1000 Ziffern)
    	int Zahlenfeld[1001];
    
    	for (int i = 0; i < 1001; i++) {
    		char c[1];
    		c[0] = Feld[i];
    		Zahlenfeld[i] = atoi(c);
    	}
    
    	for (int i = 0; i < 1001; i++)
    		cout << Zahlenfeld[i];
    
    }
    

    Die Ausgabe ist leider nicht meine Wünschen entsprechend.

    Hallo Joachim,

    der Fehler liegt wohl darin, dass das Array c[] nur ein Zeichen lang ist und keine abschließende '\0' enthält. Korrekt wäre demnach:

    char c[2];
        c[1] = char(0); // Textende setzen
        for (int i = 0; i < 1001; i++) {
            c[0] = Feld[i];
            Zahlenfeld[i] = atoi(c);
        }
    

    Eleganter (und schneller!?) geht es mit den Mitteln, die der C++-Standard bietet:

    #include <iostream>
    #include <algorithm>  // transform, copy
    #include <functional> // bind2nd, minus
    #include <iterator>   // ostream_iterator
    
    int main()
    {
        using namespace std;
        char Feld[] = "73167176531330"; // Die Zahl ist lang (1000 Ziffern)
        const size_t N = sizeof(Feld)-1;
        int Zahlenfeld[N];
        transform( Feld, Feld + N, Zahlenfeld, bind2nd( minus< int >(), int('0') ) );
        // --  Ausgabe
        copy( Zahlenfeld, Zahlenfeld + N, ostream_iterator< int >( cout ) );
        cout << endl;
        return 0;
    }
    

    Gruß
    Werner


Anmelden zum Antworten