Безопасно использовать snprintf
, предполагая, что длина используемого буфера является точной.Если длина буфера уменьшится, у вас возникнут проблемы.Вместо использования tsize
для хранения длины буфера, пусть вызывающая сторона передает длину буфера в качестве параметра.Это должно сделать вашу функцию многоразовой для разных размеров буфера.Вам все равно придется верить, что значение, предоставленное вызывающей стороной, является точным, но я полагаю, что вы не можете полностью защитить функцию от ошибок.
Если вы хотите уменьшить количество строк, объедините несколько snprintf
звонки в одну.Это должно уменьшить количество блоков проверки ошибок, которые требуются.Недостаток в том, что вы можете исчерпать буфер в середине строки, но я не думаю, что ваш текущий код также защищает от этого.Чтобы сделать это, вам нужно будет напечатать временную внутреннюю строку, измерить длину этой строки, а затем скопировать ее в выходной буфер, если и только если останется достаточно места.