Как избежать слишком маленького буфера strcpy_s

0

Мне нужно скопировать 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());
  • 1
    Если это C ++ 11, вы можете просто использовать буфер строки.
  • 0
    да это C ++ ll. Можете ли вы дать мне пример того, что вы имеете в виду ??
Показать ещё 2 комментария
Теги:
char

2 ответа

3

Использовать strncpy_s с _TRUNCATE

Например:

strncpy_s(name, data.c_str(), _TRUNCATE);

будет копировать столько, сколько может, чтобы заполнить буфер name при этом все еще принимает нулевое завершение (в отличие от традиционной strncpy).

1

Следующее возвращает результат ERANGE, потому что у вас должно быть место для завершения символа NULL. Переменные "данные" содержат 10 элементов. Когда strcpy_s достигает ограничения '5', он не может найти завершающий NULL и возвращает ERANGE.

strcpy_s (имя, 5, data.c_str());

Документация Microsoft

Функция 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';
  • 0
    Спасибо, это сработало для меня. У меня было достаточно места для строки, но я не копировал nullchar . Действительно странное поведение и определенно странное сообщение об ошибке.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню