StringCbPrintf() 1. arameter ...



  • Hallo!

    Also ich will mir den ganzen spaß mit den Strings, char-Arrays, UNICODE, ANSII etc. mal genauer anschauen.
    Und dabei bin ich auf folgende Funktion gestoßen:
    StringCbPrintf();
    http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winui/winui/WindowsUserInterface/Resources/Strings/StringReference/StringFunctions/stringcbprintf.asp
    Mein Problem ist aber, dass ich den ersten Paramater nicht so hinbekommen, dass mein Compiler zufrieden ist ...

    Dazu gibts sicher eine einfache Erklärung, aber ich kriegs nicht gebacken, mein Code:

    int main (void)
    {
    	string szText = "hallo";
    	int i = szText.size();
    	StringCbPrintf(szText.c_str(),10,"Größe: %d",i);
    	cout << szText.c_str() << endl;
    	return (0);
    };
    

    Ich möchte aber das Objekt der string-class beibehalten, oder gibts da etwas besseres?



  • Die Funktion erwartet (genau wie sprintf()) einen variablen char*(1) - string::c_str() liefert allerdings einen const char* - also klappt das wohl nicht so, wie es sollte. Um einen variablen Zeiger auf deine Daten zu erhalten, mußt du dich etwas mehr verrenken:

    StringCbPrint(&szText[0] /*variabler Zeiger auf Stringdaten*/,szText.size(),...);
    

    oder du verwendest direkt die Möglichkeiten eines String-Streams:

    stringstream outText;
    outText << "Größe: "<<i;
    cout<<outText.str()<<endl;
    

    (1) Genauer, einen TCHAR* (das ist je nach Compiler-Einstellung char* oder wchar_t*)



  • dankeschön, ich probiers mal aus!



  • Hm, also wenn ich es so mache:

    int main (void)
    {
    	string szText = "hallo";
    	int i = szText.size();
    	StringCbPrintf(&szText[0],10,"Größe: %d",i);
    	cout << szText.c_str() << endl;
    	return (0);
    };
    

    Dann gibts immernoch die Compilermeldung:
    C:\Dokumente und Einstellungen\...\stringtests\main.cpp(13) : error C2664: 'StringCbPrintfW' : Konvertierung des Parameters 1 von 'char *' in 'unsigned short *' nicht moeglich

    THX



  • Da hast du wohl im UNICODE-Modus compiliert - in dem Fall ist TCHAR = wchar_t (= unsigned short) und du benötigst einen std::wstring.
    (oder noch besser: Wenn du schon mit MFC-Funktionen arbeitest, dann solltest du auch CString verwenden)

    PS: Übrigens solltest du vor dem StringCbPrint()-Aufruf dafür sorgen, daß dein Zielstring groß genug ist für die Ausgabe (Stichwort: resize()) - sonst crasht es zur Laufzeit. Und "undefiniertes Verhalten" kann übel werden 😃



  • Joah, bin im Unicodemodus, hatte ja gesagt, dass ich da ein bissl rumgespielt habe 😃 THX

    Ich habe eigentl. mit MFC nicht viel am Hut, die Funktion wurde nur in der MSDN als recht sicher angepriesen ...
    CString schau ich mir auch mal an, Danke!

    Ähm, okay, das klappt soweit, aber jetzt hat mein Compiler etwas gegen den 3ten Parameter ...
    Code:

    int main (void)
    {
    	std::wstring szText;
    	int i = szText.size();
    	StringCbPrintf(&szText[0],10,"Größe: %d",i);
    	cout << szText.c_str() << endl;
    	return (0);
    };
    

    Fehlermeldung:
    C:\Dokumente und Einstellungen\....\stringtests\main.cpp(13) : error C2664: 'StringCbPrintfW' : Konvertierung des Parameters 3 von 'char [10]' in 'const unsigned short *' nicht moeglich.

    Wie soll ich das denn bitte anders angeben als mit "" ?

    Sorry für die dummen Fragen, aber das Stringzeugs da verwirrt sehr ...



  • Entweder als L"..." (Unicode-String) oder als _T("...") (TCHAR-String) - ich bevorzuge letzteres.



  • Ah ja, dankeschön, also so:

    int main (void)
    {
    	wstring szText;
    	int i = szText.length();
    	szText.resize(10);
    	StringCbPrintf(&szText[0],10,(L"Größe: %d"),i);
    	cout << szText.c_str() << endl;
    	szText.resize(0);
    	return (0);
    };
    

    geht es jetzt so halb ...
    Also halb heißt, dass es keien compilerfehler mehr gibt, aber die Ausgabe ist ein bissl nicht so, wie ich sie mir erwünscht habe
    nähmlich die hier:

    0x00441F02
    

    und so ^^ war das garnicht geplant ...

    und die "Vorsilbe _T wird nicht erkannt (undeklarierter Bezeichner) - muss ich da noch etwas einbinden?



  • Also wenn du mit Unicode arbeitest, dann doch bitte konsequent - und dazu gehört auch wcout (oder du mußt den String per narrow() in einen char-String umrechnen).

    (und btw, das .c_str() bei der Ausgabe kannst du weglassen - C++ Streams können C++-Strings direkt ausgeben)

    PS: Das Makro _T() steht afaik in TCHAR.H.



  • Nur so als kleiner hinweis.

    StringCbPrintf nimmt size in bytes in dem fall hast du die größe für 5 Zeichen angegeben. Desweiteren bin ich mir gerade nicht sicher ob das was ihr da mit wstring veranstaltet überhaupt erlaubt ist und nicht zu undefiniertem verhalten führt.

    Wenn man die String* Funktionen verwenden möchte und die Anzahl der Zeichen angeben möchten (und nicht in bytes) verwendet man die StringCch* Funktionen.

    in eurem fall wäre das dann StringCchPrintf

    BR



  • Hallo!

    so, okay, das funktioniert jetzt soweit!

    Jetzt ist nur noch das 1 Problem, warum ich mich eigentl. mit UNICODE beschäftigt habe, ich möchte das 'ß' und das 'ö' anzeien lassen, aber das funktioniert mit diesem Code nicht:

    int main (void)
    {
    	wstring szText;
    	szText.resize(10);
    	int i = szText.size();
    	StringCchPrintf(&szText[0],10,(L"Größe: %d"),i);
    	std::wcout << szText;
    	szText.resize(0);
    	return (0);
    };
    

    Bei der Ausgabe werden dann für das 'ö' und das 'ß' halt doofe Zeichen eingesetzt und genau das wollte ich doch mit UNICODE verhindern *heul*
    es spielt dabei auch keine Rolle, ob ich das Macro L oder _T() benutze ...

    Woran liegt denn das jetzt?

    Und @ evilissimo, wie würdest du das denn mit dem wstring "veranstalten"? Ich bin offen für jede Idee, bin recht neugierig bei dem Thema im Mom, wenn ich dann erstmal meinen eigenen Weg gefunden habe ist ja alles okay, aber jetzt interessiert mich alles 😃


Anmelden zum Antworten