Fabio A Mazzarino wrote:
[...]
>
> Solução:
> Existem duas soluções. Ambas passam por um processo de alocar memória
> para armazenar o texto convertido.
> Solução #1 (mais simples) - alocar um array ao invés de um ponteiro
>
> 1 float pi = 3.1415;
> 2 char escreve[10];
> 3 sprintf(escreve, "%f", pi);
>
> Note que na linha 2 vc está alocando 10 caracteres, e que na linha 2
> vc passa o array sem índice, que é equivalente a um ponteiro.
dois comentários:
* vc poderia usar ao invez do "%f" algo como "%9f" pra limitar o numero
de caracteres (lembre-se que vc tbm tem que lembrar do \0 que vai no
final). Só não estou bem certo se a sintaxe %9f funciona ou se tem que
ser %9.5f... meu C já está enferrujado :-)
Não sei qtos caracteres o %f mostra no máximo, mas do jeito que está,
deixa margem pra dar um SegFault ainda. Ou então, vc resolve mudar de
float p/ double e esquece de aumentar a string... ai tá feita a
mercadoria - e mais um bug (grave) p/ estatísticas...
* sempre que possível, é interessante evitar deixar coisas implicitas,
então, onde for usar como ponteiro, deixe bem claro pra evitar
'incidentes' depois; algo bem explicito como
sprintf(&(escreve[0]), ...
ou talvez
sprintf(&escreve[], ...
ou ainda
sprintf(&escreve, ...
É, definitivamente meu C está bem enferrujado - só testando os comandos
acima, mas acredito que todos funcionem da mesma forma.
> Solução #2 (mais complexa e desnecessária) - alocar um ponteiro e
> alocar memória manualmente
>
> 1 float pi = 3.1415;
> 2 char *escreve;
> 3 escreve = malloc(10 * sizeof(char));
> 4 sprintf(escreve, "%f", pi);
> 5 free(escreve);
>
> Nesta solução vc continua alocando um ponteiro para caracter, mas
> logo abaixo explicitamente aloca 10 caracteres em memória. Assim vc
> tem memória alocada e o ponteiro aponta uma posição de memória alocada
> para uso do programa.
> Note que depois do comando free vc não pode mais usar o ponteiro
> escreve como um ponteiro para uma área de memória alocada, e portanto,
> dependendo da operação, pode causar outro seg-fault.
Nunca é demais lembrar: SEMPRE fazer free() de TODOS os mallocs()!!!
:-)
Outro dia vi numa camiseta (nerd no último) aqui na unicamp:
Feed the children.
Save the wales.
Free mallocs.
:-)
--
Marcos