int als ziffern in einen array packen
-
Na komm ... Referenzen sind doch noch etwas schöner ...
#include <cmath> template< typename T_dest, typename T_num > size_t get_digits(T_dest*& dest, T_num number) { if (!number ) { dest = new T_dest[ 1 ](); return 1; } const std::size_t num_digits(std::log10(static_cast< float >( number ) ) + 1); dest = new T_dest[ num_digits ]; for (size_t i(num_digits); i; number /= 10, --i) dest[ i - 1 ] = number % 10; return num_digits; }
naja egal
-
(D)Evil schrieb:
Na komm ... Referenzen sind doch noch etwas schöner ...
Dir werd' ich's wohl nie Recht machen können...
greetz, Swordfish
PS:
std::size_t
... istsize_t
nicht irgendwann als Keyword in den Sprachstandard eingegangen, oder ist das eine Compilererweiterung?
-
Das hatten wir doch schon, hier ist eine Funktion, die eine Zahl in ihre Dezimalziffern zerlegt.
Und in diesem Fall hieße es einfach:
#include <iostream> int main() { using namespace std; int zahl = 1234; int ziffern[5]; int* end = dezimal_ziffern( zahl, ziffern ); for( int* p = ziffern; p != end; ++p ) cout << *p << " " << endl; cout << endl; return 0; }
.. und wenn Ihr das in ein dynamisches Array packen wollt, so gibt's doch vector (was denn sonst):
#include <iostream> #include <vector> #include <iterator> int main() { using namespace std; int zahl = 1234; vector< int > ziffern; dezimal_ziffern( zahl, back_inserter( ziffern ) ); // ... return 0; }
Gruß
Werner
-
nice
greetz, Swordfish
-
Swordfish schrieb:
pumuckl schrieb:
Zusammengefasst die Version mit dem modulo-operator, ohne groses sstream-gefrickel
/* ... */
Zusammengefasst die Version mit dem Modulo-Operator, ohne schlimmere Fehler:
hups wo waren denn bei mir die schlimmeren Fehler?
-
Swordfish schrieb:
PS:
std::size_t
... istsize_t
nicht irgendwann als Keyword in den Sprachstandard eingegangen, oder ist das eine Compilererweiterung?Laut '98er C++-Standard liegt size_t im Namensraum std und muss über den passenden Bibliotheksheader definiert werden. In einer Notiz zu 3.7.3 heisst es dort:
However, referring to std, std::bad_alloc, and
std::size_t is ill-formed unless the name has been declared by including the appropriate header.
-
pumuckl schrieb:
Zusammengefasst die Version mit dem modulo-operator, ohne groses sstream-gefrickel
int number; /* ... */ int ndigits = log10(number) + 1; int* digits = new int[ndigits]; while(number) { digits[--ndigits] = number%10; number/=10; }
pumuckl schrieb:
hups wo waren denn bei mir die schlimmeren Fehler?
zunächst übersetzt der Code nicht unbedingt, da log10(int) nicht existiert und der Compiler nicht weiß, ob er log10(float) oder log10(double) hernehmen soll (Fehlermeldung: ambiguous call to overloaded function). Und zum anderen hat der Anwender am Ende keinerlei Informationen darüber, wie viele Ziffern jetzt in digits[] stehen ... er kann faktisch gar nicht auf die Ziffern zugreifen.
Ich stelle bei mir selber auch immer wieder fest: ein gar nicht oder nicht ausreichend getestetes Codesegment enthält fast immer Fehler.
Gruß
Werner
-
Ok *zerknirscht*, das mit den digits war blöd, beim testen "wusste" ich ja immer wieviele Ziffern es sein müssten. das log10(int) hat er bei mir allerdings gefressen ohne zu mosern.
#include <cmath> #include <cstddef> unsigned int number; /* ... */ std::size_t ndigits = (number ? std::log10(number*1.0f)+1 : 1); unsigned char* digits = new unsigned char[ndigits](0); for(std::size_t n=ndigits; number!=0; number/=10) digits[--n] = number%10;
Sollte es beheben.
-
pumuckl schrieb:
Sollte es beheben.
number = 0;
?greetz, Swordfish
-
habs reineditiert, ebenso wie vorzeichenlose Typen um negative number zu vermeiden. Solche Dinge zu beruecksichtigen (Spezialfaelle wie numbers==0) muss ich mir noch einpruegeln, daher danke Swordfish