您在这两个问题上都是正确的,尽管它们实际上都是同一个问题(即访问超出数组边界的数据)。
解决第一个问题的方法是使用std::snprintf https://en.cppreference.com/w/cpp/io/c/fprintf,它接受缓冲区大小作为参数。
第二个问题的解决方案是给出最大长度参数snprintf
。例如:
char buffer[128];
std::snprintf(buffer, sizeof(buffer), "This is a %.4s\n", "testGARBAGE DATA");
// std::strcmp(buffer, "This is a test\n") == 0
如果你想存储整个字符串(例如在这种情况下sizeof(buffer)
太小),运行snprintf
twice:
int length = std::snprintf(nullptr, 0, "This is a %.4s\n", "testGARBAGE DATA");
++length; // +1 for null terminator
char *buffer = new char[length];
std::snprintf(buffer, length, "This is a %.4s\n", "testGARBAGE DATA");
(您可能可以使用以下方法将其放入函数中va
或可变参数模板。)