anfängerprobleme mit sprintf
-
Hacker schrieb:
Außerdem müsstest du nicht &temp3 sondern temp3.c_str() schreiben. Und selbst das geht nicht...
Warum erzählst Du's dann!?
#include <iostream> #include <sstream> #include <iomanip> #include <cstdio> using namespace std; int main( ) { unsigned value = 42; // C++ stringstream ss( "" ); ss << setbase( 16 ) << setfill( '0' ) << setw( 4 ) << value; cout << ss.str( ) << endl; // C-like char buffer[ 5 ]; sprintf( buffer, "%04x", value ); cout << buffer << endl; }
-
darf ich daraus schließen das c besser als c++ ist, weil die c lösung kürzer ist?
-
kens0o schrieb:
darf ich daraus schließen das c besser als c++ ist, weil die c lösung kürzer ist?
Nein! Swordsfish Lösung ist unnötig lang.
#include <sstream> #include <iomanip> #include <iostream> //... std::ostringstream stream; stream << std::ios::hex << 105; std::cout << stream.str() << '\n';
C++ ist allerdings da viel sicherer.
-
kens0o schrieb:
darf ich daraus schließen das c besser als c++ ist, weil die c lösung kürzer ist?
Jupp. Also mach in Zukunft lieber nur reines C.
-
kens0o schrieb:
darf ich daraus schließen das c besser als c++ ist, weil die c lösung kürzer ist?
klar!
Hacker schrieb:
Nein! Swordsfish Lösung ist unnötig lang.
-
( btw: ich muss c++ nehmen)
das klappt leider nicht ganz, irgendwie mogelt der mir eine 8 darein:
std::ostringstream stream; stream << std::ios::hex << akku; temp2="$00"; temp2.append(stream.str()); filetext[value] = temp2; cout << "akku: " << akku << "test2: " << temp2 << endl; ausgabe: akku: 32 test2: $00832
-
#include <sstream> #include <iomanip> #include <iostream> int main( ) { std::ostringstream stream; stream << std::hex << 105; std::cout << stream.str() << '\n'; }
Tut mir leid Jetzt richtig
-
jetzt hab ich die lösung von swordfish genommen
habt ihr bitte auch ne lösung für mein 2tes problem mit der for schleife (erster post)?!
-
kens0o schrieb:
[...] irgendwie mogelt der mir eine 8 darein:
das machst Du schon selbst,
kens0o schrieb:
stream << std::ios::hex << akku;
in dem du hier einfach so ein Format flag in den stream schiebst.
Wenn schon Format flags setzen, dann richtig:
std::ostringstream stream; stream.setf( std::ios::hex, std::ios::basefield ); stream << 42;
-
Oder std::hex nehmen.
-
... und da wir uns jetzt g'rad' so schön einig sind, packen wir's noch in eine Funktion und vergessen den Quatsch wieder.
#include <iostream> #include <sstream> #include <iomanip> #include <string> std::string to_hex_string( const unsigned value, const unsigned width = 4, const std::ostream::char_type fill = '0' ) { static std::ostringstream ss; ss.str( "" ); ss << std::hex << std::setfill( fill ) << std::setw( width ) << value; return ss.str( ); } int main( ) { std::string foo = to_hex_string( 42 ); std::cout << "foo: " << foo << std::endl; }
-
Ich biete dagegen!
#include <iostream> #include <sstream> #include <iomanip> std::string to_hex_string(const unsigned value) { std::ostringstream stream; stream << std::hex << value; return stream.str(); } int main() { std::cout << to_hex_string(80) << '\n'; }
-
... und was hast Du getan?
1. flexibilität eingespart
2. bloßes "Zurücksetzen" des Streams durch komplettes Neubauen des Streams ersetztEcht toll.
Aber ich hau' jetzt hier ab, wird mir en bisserl 'z blöd.
-
Ah, warte! ich hab das static nicht gesehen.
-
Swordfish schrieb:
... und was hast Du getan?
1. flexibilität eingespart
2. bloßes "Zurücksetzen" des Streams durch komplettes Neubauen des Streams ersetztEcht toll.
Aber ich hau' jetzt hier ab, wird mir en bisserl 'z blöd.Sorry, aber Hackers Lösung ist deutlich besser. Nur der formale Parameter hätte nicht const-Qualifiziert sein müssen.
-
Hacker schrieb:
Ah, warte! ich hab das static nicht gesehen.
Machs wieder hin. Das war gut, so ganz ohne static.
-
Tachyon schrieb:
Hacker schrieb:
Ah, warte! ich hab das static nicht gesehen.
Machs wieder hin. Das war gut, so ganz ohne static.
Gut. Ich dachte nur, Zeile 8 bei Swordsfish's Code wäre unnötig.
-
Oder einfach C-API. Da spart man sich den ganzen Streamoverhead (mind. 1 zusätzliche Allokation).
std::string to_hex_string(unsigned value) { char buffer[std::numeric_limits<unsigned>::digits]; return std::string(std::itoa(value, buffer, 16)); }
-
Ethon schrieb:
Oder einfach C-API. Da spart man sich den ganzen Streamoverhead (mind. 1 zusätzliche Allokation).
std::string to_hex_string(unsigned value) { char buffer[std::numeric_limits<unsigned>::digits]; return std::string(std::itoa(value, buffer, 16)); }
Nur, dass itoa kein Standard-C ist.
-
Tachyon schrieb:
Sorry, aber Hackers Lösung ist deutlich besser.
Mhm. Erklärst Du mir auch, warum?