Wieso "cannot add to pointers"?



  • Ich frage mich, wieso folgende Zeile nicht funktioniert:

    char str[255];
    strcpy(str, "test"+"test");
    

    Dann bekomme ich die Fehlermeldung "Cannot add 2 pointers". Wieso "Pointer"? Das sollten doch 2 Strings sein oder?

    Einzig dieses hier klappt:

    CString str1="t";
    CString str2="w";
    char str[255];
    strcpy(str, str1+str2);
    

    Aber das finde ich ziemlich umständlich. Geht das alles auch kürzer und intuitiver?



  • String-Literale sind nunmal kein std::string, sondern char* (und das ist ein Pointer auf einen char-Block) - das ist noch ein Erbe von C.

    Wenn du die addieren willst, mußt du selber dafür sorgen, daß mindestens ein Operand in einen string umgewandelt wird:

    string str = string("test1") + "test2";
    

    Und wenn du unbedingt mit char-Arrays und Pointern arbeiten willst:

    char str[100]="";
    strcpy(str,"test1");
    strcat(str,"test2");
    


  • wenn man c-strings an eine funktion übergibt sind das immer pointer auf den inhalt. in c und c++ kann man c-strings nicht mit + zusammenbasteln, sowas geht z.b. in java (aber da sind's ja keine c-strings sondern objekte). beim zweiten codeschnipsel wird der überladene + operator der CString klasse verwendet, deshalb geht das (es wird ein temporäres CString objekt erzeugt und dann für 'strcpy' der operator LPCTSTR verwendet, um einen pointer auf die daten zu kriegen.



  • Danke für die Aufklärung. Ich habe nun dieses hier probiert und das scheint die kürzeste Möglichkeit zu sein, um einen "Mix-String" zu erzeugen:

    char outputbuffer[255];
    sprintf(outputbuffer,"Fensterverschiebung um deltaX %d und deltaY %d", deltaX, deltaY);
    


  • JPSelter schrieb:

    Danke für die Aufklärung. Ich habe nun dieses hier probiert und das scheint die kürzeste Möglichkeit zu sein, um einen "Mix-String" zu erzeugen:

    char outputbuffer[255];
    sprintf(outputbuffer,"Fensterverschiebung um deltaX %d und deltaY %d", deltaX, deltaY);
    

    das ist schon ok, aber nur wenn du sicher bist, dass der string niemals länger wird als 255 zeichen.

    btw: ausserdem werden die c++ fans hier gleich rummeckern weil das 'C' ist.



  • Ja, für C-Programmierer ist das OK, unter C++ sieht es etwas anders aus:

    stringstream s;
    s<<"Fensterverschiebung um deltaX "<<deltaX<<" und deltaY "<<deltaY;
    
    cout<<s.str();//oder was anderes
    


  • Sieht viel besser aus, aber irgendwie mag das mein Compiler nicht 😉

    xy.cpp(390) : error C2079: 's' uses undefined class 'basic_stringstream<char,struct std::char_traits<char>,class std::allocator<char> >'
    xy.cpp(391) : error C2297: '<<' : illegal, right operand has type 'char [31]'
    

    Muss ich noch was includen? Nutze MSVC++6 (leider)...



  • #include <sstream>



  • In C++ sähe das so aus:

    #include <boost/format.hpp>
    #include <string>
    
    std::string str = boost::str( boost::format( Fensterverschiebung um deltaX %d und deltaY %d" %deltaX %deltaY ) );
    


  • JPSelter schrieb:

    Muss ich noch was includen?

    Ja, <sstream> dürfte der richtige Header sein.


Anmelden zum Antworten