Существует ли точный эквивалент strncpy в стандартной библиотеке C++? Я имею в виду функцию, которая копирует строку из одного буфера в другой, пока не достигнет завершающего 0? Например, когда мне нужно анализировать строки из небезопасного источника, такого как пакеты TCP, поэтому я могу выполнять проверки длины при копировании данных.
Я уже много искал по этой теме, и я также нашел несколько интересных тем, но все эти люди были довольны std::string::assign, который также может принимать размер символов для копирования в качестве параметра. Моя проблема с этой функцией заключается в том, что она не выполняет никаких проверок, если уже был достигнут завершающий нуль - она серьезно относится к заданному размеру и копирует данные так же, как это сделал бы memcpy в строковый буфер. . Таким образом выделяется и копируется гораздо больше памяти, чем нужно было бы, если бы была такая проверка при копировании.
Так я работаю над этой проблемой в настоящее время, но есть некоторые накладные расходы, которых я хотел бы избежать:
// Get RVA of export name
const ExportDirectory_t *pED = (const ExportDirectory_t*)rva2ptr(exportRVA);
sSRA nameSra = rva2sra(pED->Name);
// Copy it into my buffer
char *szExportName = new char[nameSra.numBytesToSectionsEnd];
strncpy(szExportName,
nameSra.pSection->pRawData->constPtr<char>(nameSra.offset),
nameSra.numBytesToSectionsEnd);
szExportName[nameSra.numBytesToSectionsEnd - 1] = 0;
m_exportName = szExportName;
delete [] szExportName;
Этот фрагмент кода является частью моего синтаксического анализатора PE-бинарников (точнее, подпрограммы, анализирующей экспортную таблицу). rva2sra преобразует относительный виртуальный адрес в относительный адрес PE-раздела. Структура ExportDirectory_t содержит RVA для имени экспорта двоичного файла, которое должно быть строкой, заканчивающейся нулем. Но это не всегда должно быть так - если кому-то этого захочется, он сможет опустить завершающий ноль, из-за чего моя программа запустится в памяти, которая не принадлежит разделу, где она, в конце концов, рухнет ( в лучшем случае...).
Было бы несложно реализовать такую функцию самостоятельно, но я бы предпочел, чтобы для этого существовало решение, реализованное в стандартной библиотеке C++.
std::string
не заканчиваются нулем. Вам нужна копия строки или просто копия всего до первого нулевого байта (который может там быть, а может и не быть)? - person Seth Carnegie   schedule 16.01.2012