2011-01-06 9 views
5

Potrzebuję sformatować ciąg znaków, aby był ciągiem zakończonym podwójnym zakończeniem, aby móc używać funkcji SHFileOperation.Podwójny łańcuch zakończony znakiem Null

Ciekawe jest to, znalazłem jedną z następujących czynności działa, ale nie zarówno:

// 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); 

Czy ktoś ma pomysł na to?

Czy istnieje inny sposób dołączania ciągów o podwójnej końcówce?

+1

która z nich działa? – zsalzbank

+0

Żadne z tych * nie * powinno działać. To po prostu wypadek, jeśli któryś z nich to zrobi. –

+0

@Greg: nie powinien działać drugi przykład, ponieważ CString ma następujący "przyjaciel CString operator + (const CString & string, LPCTSTR lpsz);'? (przez pracę mam na myśli operację +, nie przekazuję 'CString' do' SHFileOperation') –

Odpowiedz

8

Sama klasa CString nie ma problemu z łańcuchem zawierającym znak null. Problem polega na umieszczaniu pustych znaków w łańcuchu. Pierwszy przykład działa, ponieważ dołącza pojedynczy znak, a nie ciąg znaków - akceptuje znak bez sprawdzania, czy jest pusty. Drugi przykład próbuje dołączyć typowy ciąg C, który z definicji kończy się na pierwszym znaku pustym - skutecznie dodajesz pusty ciąg.

+0

Ułóż inaczej, użyj cudzysłowów pojedynczych lub podwójnych ... –

+1

@Mr_and_Mrs_D Nie tylko pojedyncze cytaty, ale pojedyncze cudzysłowy wokół * pojedynczego znaku *. Jak zauważa Mooing Duck, możesz umieścić dwa znaki w pojedynczym cudzysłowie, ale nie dodasz dwóch znaków do ciągu. –

4

Do tego celu nie można użyć CString. Trzeba będzie użyć własnego char[] bufor:

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

Chociaż można to zrobić tylko kopiując jedną NUL bajt po istniejącym NUL terminatorem, wolałbym, aby skopiować dwa tak, że kod źródłowy dokładniej odzwierciedla zamiar programisty.

+0

Dzięki za sugestię. Ale jak to się dzieje, że Przykład 1 działa ... – wengseng

+1

@wengseng, rzeczywiście możesz użyć CString do tego celu, a Przykład 1 to sposób, w jaki to robisz. Zanim użyłbym bufora o stałym rozmiarze, użyłbym 'std :: vector '. –

+0

std :: string również będzie działać, zanim będzie musiał wrócić do 'char []'. –

Powiązane problemy