Có chính xác tương đương strncpy trong Thư viện chuẩn C++ không? Tôi có nghĩa là một chức năng, mà sao chép một chuỗi từ một bộ đệm khác cho đến khi nó chạm vào chấm dứt 0? Ví dụ khi tôi phải phân tích chuỗi từ một nguồn không an toàn, chẳng hạn như các gói TCP, vì vậy tôi có thể thực hiện kiểm tra chiều dài trong khi đối phó dữ liệu.tương đương strncpy cho std :: string?
Tôi đã tìm kiếm rất nhiều về chủ đề này và tôi cũng tìm thấy một số chủ đề thú vị, nhưng tất cả những người đó đều hài lòng với std :: string :: assign, cũng có thể lấy kích thước ký tự để sao chép tham số. Vấn đề của tôi với chức năng này là, nó không thực hiện bất kỳ kiểm tra nếu một null chấm dứt đã được nhấn - nó có kích thước nhất định nghiêm trọng và sao chép dữ liệu giống như memcpy sẽ làm điều đó vào bộ đệm của chuỗi. Bằng cách này có nhiều bộ nhớ hơn được phân bổ và sao chép hơn là nó phải được thực hiện, nếu có một kiểm tra trong khi đối phó.
Đó là cách tôi đang làm việc xung quanh vấn đề này hiện nay, nhưng có một số overhead tôi muốn tránh:
// 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;
Đoạn mã này là một phần của phân tích cú pháp của tôi cho PE-mã nhị phân (của việc phân tích cú pháp bảng xuất khẩu, chính xác). rva2sra chuyển đổi địa chỉ ảo tương đối thành địa chỉ có liên quan đến PE. Cấu trúc ExportDirectory_t chứa RVA đối với tên xuất của tệp nhị phân, trong đó nên là một chuỗi không bị chấm dứt. Nhưng điều đó không phải lúc nào cũng phải như vậy - nếu ai đó thích nó, nó sẽ có thể bỏ qua số không kết thúc mà sẽ làm cho chương trình của tôi chạy vào bộ nhớ không thuộc về phần, nơi nó cuối cùng sẽ sụp đổ (Trong trường hợp tốt nhất...).
Sẽ không có vấn đề lớn khi thực hiện một chức năng như vậy, nhưng tôi thích nó nếu có giải pháp cho việc này được thực hiện trong Thư viện chuẩn C++.
'std :: string's không bị hủy. Bạn có muốn một bản sao của chuỗi, hoặc chỉ là một bản sao của tất cả mọi thứ lên đến byte null đầu tiên (có thể hoặc có thể không có)? –
Ồ, tốt để biết. Tôi muốn sao chép tất cả mọi thứ lên đến byte null đầu tiên. – athre0z
[Hãy cẩn thận những gì bạn yêu cầu.] (Http://the-flat-trantor-society.blogspot.com/2012/03/no-strncpy-is-not-safer-strcpy.html) –