Как уже написали, segmentation fault - выход за границы отведённой памяти. Наверняка функция что-то пишет в эту строку (хотя может и читать за её границей, но менее вероятно - ноль на конце всё-таки). Рецепт прост - нужно понять, какого размера строка ожидается и выделять нужный размер по new. Частая практика - передавать сначала NULL вместо буфера, чтобы функция вернула ожидаемый нужный размер.
Возможно, %g не так уж и не подходит, см. описание.
Экспоненциальная форма записи должна случаться только тогда, когда число меньше 10^-2 (при точности округления %.2g).
Т.е. если проверить, что число заведомо больше 0,01, то можно её использовать.