использование strcpy_s для указателя TCHAR (Microsoft Specific) - PullRequest
5 голосов
/ 01 июня 2010

Мне было интересно, какой путь правильный?

_tcscpy(tchar_pointer, _tcslen(tchar_pointer), _T("Hello World"));

или

_tcscpy(tchar_pointer, _tcsclen(tchar_pointer), _T("Hello World"));

или

_tcscpy(tchar_pointer, ???, _T("Hello World"));

Ответы [ 4 ]

7 голосов
/ 01 июня 2010

Если вы используете _tcscpy_s, а не _tcscpy, вторым параметром должен быть фактический размер массива, а не длина текущей содержащейся строки.Например:

TCHAR dest[20];
_tcscpy_s(dest, _countof(dest), _T("Hello"));

Можно даже использовать версию с двумя параметрами, для которой не требуется параметр размера:

_tcscpy_s(dest, _T("Hello"));

Если tchar_pointer на самом деле указатель, а не массив(как следует из его названия) вы должны быть очень осторожны при определении того, какова его реальная емкость.Потребуется больше контекста, чтобы предложить правильный подход, но использование длины содержащейся строки для вычисления размера буфера почти наверняка является неправильным подходом.

6 голосов
/ 01 июня 2010

указатель tchar поступает извне, и моя сторона не знает, насколько велик буфер, на который ссылается указатель

Если это так, то ни один из них не делает то, что вы хотите.

Способ работы всех «безопасных» функций заключается в том, что вы говорите им, насколько велик целевой буфер.

Вы не знаете? Вы не можете использовать эти функции.

int buffer_size = _tcslen(xxx) * sizeof(TCHAR)

Это не будет работать . Все это гарантирует, что скопированная строка не длиннее того, что уже находится в буфере. Если буфер не был инициализирован, он потерпит неудачу; если буфер начинается с '\0', ничего не будет скопировано; и пр.

3 голосов
/ 01 июня 2010

ответ бара очень важен для вас, потому что правильный ответ отличается от всех перечисленных вами идей. Но Бара не объяснил вам разницу между _tcslen и _tcsclen, поэтому я сделаю это.

В компиляции Unicode _tcslen и _tcsclen будут считать количество TCHAR в текущем значении строки. Каждый TCHAR - это один wchar_t.

В многобайтовой компиляции _tcslen будет подсчитывать количество TCHAR в текущем значении строки. Каждый TCHAR - это один символ. Но _tcsclen будет подсчитывать количество многобайтовых символов в текущем значении строки. Каждый многобайтовый символ представляет собой один или несколько символов TCHAR, каждый многобайтовый символ представляет собой один или несколько символов. Различные многобайтовые символы могут иметь разную длину в зависимости от кодовой страницы и отдельных символов.

2 голосов
/ 01 июня 2010

Если tchar_pointer является указателем (в отличие от массива), вы должны сами знать, насколько велик буфер, на который указывает указатель. Если вы не знаете, вы не можете узнать из необработанного указателя, strcpy_s там не поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...