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.


  • Mod

    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.

    http://codepad.org/Rme6HyMI



  • ( 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 ersetzt

    Echt 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 ersetzt

    Echt 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?


Anmelden zum Antworten