2017-03-09 9 views
1

Ich habe den folgenden Code:Wie verketten Sie ein TCHAR-Array mit einer Zeichenfolge?

enter code here 
TCHAR szSystemDirectory[MAX_PATH] ; 
GetSystemDirectory(szSystemDirectory, MAX_PATH) ; 
_stprintf(szSystemDirectory, _T("%s"), L"\\"); 

AfxMessageBox(szSystemDirectory); 

und will wie diese immer zwei Schrägstriche szSystemDirectory variabel, aber Endergebnis verketten:

\

Wie lösen?

Vielen Dank für jede Hilfe oder Anregung.

+0

Warum nicht einfach eine String-Klasse verwenden? – PaulMcKenzie

+0

[Du bist auf Escape-Zeichen gestoßen.] (Https://en.wikipedia.org/wiki/Escape_sequences_in_C) TLDR; '\' hat eine besondere Bedeutung. "\\" ist ein Schrägstrich. Wenn Sie zwei wollen, müssen Sie 4 verwenden: "\\\\" – user4581301

+1

TCHAR ist kein echter Typ; Es ist ein #define, das abhängig davon, ob das UNICODE-Flag gesetzt ist, auf CHAR oder WCHAR gesetzt wird. Es gibt keinen wirklichen Grund, es mehr zu benutzen, und tatsächlich würde Ihr Code nicht funktionieren, wenn das UNICODE-Flag nicht gesetzt wäre, da Sie die '_T()' - und 'L'-Makros synonym verwenden. – MrEricSir

Antwort

1

nicht sicher, ob die „zwei Schrägstriche“, was nicht nur etwas, das Sie in die sehen Debugger (da es einen einzigen Schrägstrich als ein escaped zeigen würde), aber - das größte Problem, das Sie haben, ist, dass Sie den Inhalt von szSystemDirectory mit dem _stprintf Aufruf überschreiben. Ich denke, was Sie wollten, war das \ Zeichen am Ende des Pfades zu drucken. Versuchen

TCHAR szSystemDirectory[MAX_PATH + 2]; // 1 for null terminator, 1 for the slash 
UINT nCharactersWritten = GetSystemDirectory(szSystemDirectory, MAX_PATH); 
szSystemDirectory[nCharactersWritten] = _T('\\'); 
szSystemDirectory[nCharactersWritten + 1] = _T('\0'); 

oder für zwei Schrägstriche:

TCHAR szSystemDirectory[MAX_PATH + 3]; // 1 for null terminator, 2 for the slashes 
UINT nCharactersWritten = GetSystemDirectory(szSystemDirectory, MAX_PATH); 
szSystemDirectory[nCharactersWritten] = _T('\\'); 
szSystemDirectory[nCharactersWritten + 1] = _T('\\'); 
szSystemDirectory[nCharactersWritten + 2] = _T('\0'); 

_stprint_f ist in Visual Studio 2015 als veraltet erklärt worden, so dass, wenn Sie die Druckfunktionen verwenden möchten, können Sie versuchen:

TCHAR szSystemDirectory[MAX_PATH + 2]; // 1 for null terminator, 1 for the slash 
UINT nCharactersWritten = GetSystemDirectory(szSystemDirectory, MAX_PATH); 
_stprintf_s(szSystemDirectory + nCharactersWritten, MAX_PATH + 2 - nCharactersWritten, _T("%s"), _T("\\")); 

oder für zwei Schrägstriche

TCHAR szSystemDirectory[MAX_PATH + 3]; // 1 for null terminator, 2 for the slashes 
UINT nCharactersWritten = GetSystemDirectory(szSystemDirectory, MAX_PATH); 
_stprintf_s(szSystemDirectory + nCharactersWritten, MAX_PATH + 3 - nCharactersWritten, _T("%s"), _T("\\\\")); 
1

\ ist das Escape-Zeichen. z.B. "\ n" codiert einen Zeilenumbruch. Was das bedeutet ist, dass \ immer anzeigt, dass das nächste Zeichen als ein Sonderzeichen behandelt werden soll. Also, wenn Sie den Compiler sagen wollen, dass Sie eine wörtliche \ Zeichen, das Sie brauchen es die gleiche Art und Weise zu entkommen:

\\ codes a single \ 

\\\\ codes double slashes 
Verwandte Themen