использование strcpy_s для указателя TCHAR (Microsoft Specific)

Я задавался вопросом, который является корректным путем?

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

или

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

или

_tcscpy(tchar_pointer, ???, _T("Hello World"));
5
задан James McNellis 1 June 2010 в 02:13
поделиться

4 ответа

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

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

Все "безопасные" функции работают так, что вы сообщаете им размер целевого буфера.

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

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

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

6
ответ дан 18 December 2019 в 09:05
поделиться

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

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

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

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

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

7
ответ дан 18 December 2019 в 09:05
поделиться

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

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

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

3
ответ дан 18 December 2019 в 09:05
поделиться

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

2
ответ дан 18 December 2019 в 09:05
поделиться
Другие вопросы по тегам:

Похожие вопросы: