У меня есть эта уродливая функция, и я чувствую, что весь strncpy
должен быть просто strcpy
:
void PackData(char*& cursor, const std::string& data) {
*(reinterpret_cast<int*>(cursor)) = static_cast<short>(data.length() + 1);
cursor += sizeof(int);
// copy the text to the buffer
::strncpy(cursor, data.c_str(), data.size());
cursor += (data.length() * sizeof(char));
*(reinterpret_cast<char*>(cursor)) = 0;
cursor += sizeof(char);
}
cursor
гарантированно достаточно места, чтобы вместить все скопированные данные. А также data
содержит только '\0'
персонаж в конце.
Я хочу обновить эту функцию, чтобы использовать strcpy
и убрать некрасивых. Вот что у меня есть:
void PackData(char*& cursor, const std::string& data) {
const int size = data.size() + 1;
std::copy_n(cursor, sizeof(int), reinterpret_cast<char*>(&size));
cursor += sizeof(int);
strcpy(cursor, data.c_str());
cursor += size;
}
Мой код работает нормально, но я хотел спросить, видит ли кто-нибудь какое-либо плохое поведение, которое я, возможно, пропустил?
Кто бы ни написал этот код, он понятия не имел, что делает. Что использование strncpy
не имеет смысла, поскольку длина, переданная ему в вызове, является длиной источника, а не пункта назначения. И это reinterpret_cast
в конце просто бросает cursor
в первоначальном виде. Избавься от этой чепухи. Ваш код является хорошей заменой.
Других решений пока нет …