Во-первых: ваша проблема в том, как вы возвращаете строку, а не в число с плавающей точкой, поэтому я сокращаю свой пример до простого возвращения строки.
Существует два способа реализации этого: память для вашей строки выделяется функцией или вызывающей стороной. Простой способ заключается в следующем:
void toString(char *str, int d) {
sprinf(str, "%d", d);
}
int main(void) {
char result[12];
toString(result, 50);
puts(result, stdout);
return 0;
}
В этом случае result
- это 12-байтовая строка, расположенная в стеке main
. 12 байтов достаточно велики, чтобы хранить строковое представление целого числа, так что это безопасно, если вы не уверены, какой размер может иметь результат, тогда следите.
Второй вариант:
void toString(char **str, int d) {
char *v_str = malloc(12);
sprintf(v_str, "%d", d);
*str = v_str;
}
int main(void) {
char *result;
toString(&result, 50);
puts(result, stdout);
free(result);
return 0;
}
В этом случае мы притворяемся, что вызывающая сторона не знает, сколько памяти требуется для строки результата, и разрешаем решать функции toString
. Он выделяет столько памяти, сколько необходимо для преобразования, а затем возвращает выделенную строку. Вызывающий должен освободить эту память с free
. Обратите внимание, что в этой ситуации мы должны передать адрес и результат, поэтому toString
запишет указатель на выделенную строку в нашу переменную результата. Подобные двойные указатели могут показаться запутанными некоторым новичкам в C, но концептуально это похоже на то, как вы передаете указатель на переменную с плавающей точкой (float * fGross).
Лично я предпочитаю первая версия, когда это возможно, поскольку при выделении памяти в стеке не требуется управлять памятью кучи с помощью mallo c и free, что является распространенным источником утечек памяти, особенно для начинающих. Конечно, ничто не мешает вам вызывать эту версию toString с выделенной кучей памятью, если вам нужно.