Мне нужно скопировать std::string data
в массив символов. Длина моей строки является переменной, но длина моего массива char фиксирована.
const int SIZE = 5;
char name[SIZE];
std::string data = "1234567890";
strcpy_s(name, 5, data.c_str()); //causes a buffer is too small assertion
strcpy_s(name, 11, data.c_str());//copies fine (length of data plus null)
strcpy_s(name, sizeof(data), data.c_str()); // copies fine
Как я могу копировать только длину массива безопасно каждый раз? Не получая assert и не вызывая буфера за запуск.
Должен ли я делать это так каждый раз?
std::string toCopy = data.substr(0,SIZE-1);
strcpy_s(name, toCopy.c_str());
Использовать strncpy_s с _TRUNCATE
Например:
strncpy_s(name, data.c_str(), _TRUNCATE);
будет копировать столько, сколько может, чтобы заполнить буфер name
при этом все еще принимает нулевое завершение (в отличие от традиционной strncpy).
Следующее возвращает результат ERANGE, потому что у вас должно быть место для завершения символа NULL. Переменные "данные" содержат 10 элементов. Когда strcpy_s достигает ограничения '5', он не может найти завершающий NULL и возвращает ERANGE.
strcpy_s (имя, 5, data.c_str());
Функция strcpy_s копирует содержимое в адрес strSource, включая конечный нулевой символ, в местоположение, указанное strDestination. Строка назначения должна быть достаточно большой, чтобы удерживать исходную строку и ее завершающий нулевой символ. Поведение strcpy_s не определено, если исходная и целевая строки перекрываются.
Альтернативный подход
string data = "0123456789";
int SIZE = 5;
char name[SIZE];
size_t length = data.copy( name, 0, 5 );
buffer[ length ] = '\0';
nullchar
. Действительно странное поведение и определенно странное сообщение об ошибке.