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:
1474836472147483647214748364721474836472147483647214748364und 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