Во-первых, вы можете изменить способ * печати.Вместо того, чтобы просить вашу строку, просто поместите ее в конец.
Теперь, вместо того, чтобы записывать результаты непосредственно в выходной поток, вы можете записать во внутренний буфер, а когда вы закончите, простоигнорируйте два последних символа в нем.
void decomposicao(int n)
{
const size_t len = 512;
char buffer[len];
size_t written = 0;
written = snprintf(buffer, len, "%d = ", n);
while (n%2 == 0)
{
n = n/2;
written += snprintf(buffer + written, len - written, "%d * ", 2);
}
for (int i = 3; i <= sqrt(n); i = i+2)
{
while (n%i == 0)
{
n = n/i;
written += snprintf(buffer + written, len - written, "%d * ", i);
}
}
if (n > 2)
written += snprintf(buffer + written, len - written, "%d * ", n);
buffer[len - 1] = '\0';
buffer[written - 2] = '\0';
printf("%s\n", buffer);
}