Оба ваших утверждения верны.
Есть еще одна проблема, не упомянутая.Проверка параметров не производится.Если вы не соответствуете строке формата и параметрам, это может привести к неопределенному и нежелательному поведению.Например:
char buf[1024] = {0};
float f = 42.0f;
sprintf(buf, "%s", f); // `f` isn't a string. the sun may explode here
Это может быть особенно неприятно для отладки.
Все вышеперечисленное приводит многих разработчиков C ++ к выводу, что вы никогда не должны использовать sprintf
и его братьев.Действительно, есть средства, которые вы можете использовать, чтобы избежать всех вышеперечисленных проблем.Один, streams, встроен прямо в язык:
#include <sstream>
#include <string>
// ...
float f = 42.0f;
stringstream ss;
ss << f;
string s = ss.str();
... и еще один популярный выбор для тех, кто, как и я, все еще предпочитает использовать sprintf
, исходит от форсированного формата библиотеки :
#include <string>
#include <boost\format.hpp>
// ...
float f = 42.0f;
string s = (boost::format("%1%") %f).str();
Следует ли вам принять мантру "никогда не используй спринт"?Решай сам.Обычно есть лучший инструмент для работы, и в зависимости от того, что вы делаете, sprintf
может быть просто.