anfängerprobleme mit sprintf
-
hi,
ich baue grade einen simulator für einfachen maschinencode,
dafür muss ich jetzt aus einer hexzahl einen string machen und kriege es nicht hin:int akku= 0x6a string temp3; sprintf(&temp3,"%x",akku); |87|error: no matching function for call to `sprintf(std::string*, const char[3], int&)'| |201|note: candidates are: int sprintf(char*, const char*, ...)|
außerdem habe ich grad noch ein problem festgestellt:
ich würde gerne den iterator "pc" meiner for-schleife in der schleife beeinflussen, bekomme aber den fehler
" |293|error: no match for 'operator=' in 'pc = (temp3 - 1)' "
-
Mach es doch einfach mit Stringstreams und std::ios::hex! Spar dir den C-Kram.
Außerdem müsstest du nicht &temp3 sondern temp3.c_str() schreiben.
Und selbst das geht nicht... also lieber wie oben gesagt.
-
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)); }