2011-01-06 3 views
5

Ich muss eine Zeichenfolge formatieren, um doppelte nullterminierte Zeichenfolge zu sein, um SHFileOperation zu verwenden.Doppelte nullterminierte Zeichenfolge

Interessante daran ist, i eine der folgenden Arbeits gefunden, aber nicht beides:

// Example 1 
    CString szDir(_T("D:\\Test")); 
    szDir = szDir + _T('\0') + _T('\0'); 

    // Example 2 
    CString szDir(_T("D:\\Test")); 
    szDir = szDir + _T("\0\0"); 

    //Delete folder 
    SHFILEOPSTRUCT fileop; 
    fileop.hwnd = NULL; // no status display 
    fileop.wFunc = FO_DELETE; // delete operation 
    fileop.pFrom = szDir; // source file name as double null terminated string 
    fileop.pTo = NULL; // no destination needed 
    fileop.fFlags = FOF_NOCONFIRMATION|FOF_SILENT; // do not prompt the user 
    fileop.fAnyOperationsAborted = FALSE; 
    fileop.lpszProgressTitle  = NULL; 
    fileop.hNameMappings   = NULL; 
    int ret = SHFileOperation(&fileop); 

Hat jemand Idee dazu hat?

Gibt es eine andere Möglichkeit, doppelt terminierte Strings anzuhängen?

+1

welche funktioniert? – zsalzbank

+0

Keiner von denen * sollte * funktionieren. Es ist nur ein Zufall, wenn einer von ihnen es tut. –

+0

@Greg: sollte das zweite Beispiel nicht funktionieren, da CString den folgenden 'friend CString-Operator hat + (const CString & string, LPCTSTR lpsz);'? (bei Arbeit meine ich die + Operation, nicht 'CString' nach' SHFileOperation') –

Antwort

8

Die CString-Klasse selbst hat kein Problem mit einer Zeichenfolge, die ein Nullzeichen enthält. Das Problem besteht darin, dass an erster Stelle Nullzeichen in die Zeichenfolge eingefügt werden. Das erste Beispiel funktioniert, weil es ein einzelnes Zeichen und keine Zeichenfolge anfügt - es akzeptiert das Zeichen wie es ist, ohne zu prüfen, ob es null ist. Das zweite Beispiel versucht, eine typische C-Zeichenfolge anzuhängen, die definitionsgemäß mit dem ersten Nullzeichen endet - Sie fügen also effektiv eine leere Zeichenfolge hinzu.

+0

Anders ausgedrückt, verwenden Sie einfach vs doppelte Anführungszeichen ... –

+1

@Mr_and_Mrs_D Nicht nur einfache Anführungszeichen, sondern einfache Anführungszeichen um ein * einzelnes Zeichen *. Wie Mooing Duck beobachtet, können Sie zwei Zeichen in die einzelnen Anführungszeichen setzen, aber Sie fügen der Zeichenfolge keine zwei Zeichen hinzu. –

4

Sie können CString nicht für diesen Zweck verwenden. Sie müssen Ihre eigenen char[] Puffer verwenden:

char buf[100]; // or large enough 
strcpy(buf, "string to use"); 
memcpy(buf + strlen(buf), "\0\0", 2); 

Obwohl Sie dies, indem nur ein Byte nach dem vorhandenen NUL Terminator mehr NUL Kopieren tun könnte, würde ich es vorziehen, zwei so zu kopieren, dass der Quellcode genauer die reflektiert Absicht des Programmierers.

+0

Danke für Ihren Vorschlag. Aber wie funktioniert das Beispiel 1 ... – wengseng

+1

@wengseng, Sie können tatsächlich CString für diesen Zweck verwenden, und Beispiel 1 ist, wie Sie es tun. Bevor ich einen Puffer dieser Größe verwenden würde, würde ich 'std :: vector ' verwenden. –

+0

std :: string würde auch funktionieren, bevor Sie zu 'char []' zurückkehren müssen. –

Verwandte Themen