You're correct on both problems, though they're really both the same problem (which is accessing data beyond the boundaries of an array).
A solution to your first problem is to instead use std::snprintf
, which accepts a buffer size as an argument.
A solution to your second problem is to give a maximum length argument to snprintf
. For example:
char buffer[128];
std::snprintf(buffer, sizeof(buffer), "This is a %.4s
", "testGARBAGE DATA");
// std::strcmp(buffer, "This is a test
") == 0
If you want to store the entire string (e.g. in the case sizeof(buffer)
is too small), run snprintf
twice:
int length = std::snprintf(nullptr, 0, "This is a %.4s
", "testGARBAGE DATA");
++length; // +1 for null terminator
char *buffer = new char[length];
std::snprintf(buffer, length, "This is a %.4s
", "testGARBAGE DATA");
(You can probably fit this into a function using va
or variadic templates.)
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…