Fscanf (Linguagem C)

5 respostas
C

No meu código isso funfa:

FILE *f; char *nome, *fone; f = fopen("exemplo.txt", "r"); fscanf(f, "%s", nome);

mas se eu acrescentar fscanf(f, “%s”, fone) deixa de funfar…

FILE *f; char *nome, *fone; f = fopen("exemplo.txt", "r"); fscanf(f, "%s", nome); fscanf(f, "%s", fone); // não funfa

Alguém manja pq?

5 Respostas

C

Voce precisa alocar memoria para os ponteiros qie voce declarou, tanto o primeiro quanto o segundo codigo estão errados,
o fato de ter funcionado da primeira forma foi apenas uma coincidência. Procure por alocação de memória com malloc.

C

Coincidência TODAS as vezes? :?

Com isso aqui eu imprimo o texto todo:

char *str; while(fscanf(f, "%s", str) > 0) { printf("%s", str); }

Não é MUITA coincidência?

V

O pior é que ele está certo:

Fonte: http://www.cplusplus.com/reference/clibrary/cstdio/fscanf/

Isso é o que o C chama de “undefined behavior”. É muito comum que um comportamento incorreto funcione várias vezes, no mesmo compilador e na mesma máquina.
O computador é determinístico. Se você der o mesmo conjunto de entradas, ele gerará a mesma saída.

A situação muda a partir do momento que você tenta compilar em outro lugar, ou quando você muda o ambiente (troca do Windows XP pro 7, por exemplo).

O único comportamento garantido é seguir rigorosamente a documentação.

C

Sim, é coincidência, o ponteiro que voce está utilizando, está apontando para um lugar qualquer da memória,
e você está sobrescrevendo o dado para o qual ele aponta com valores do arquivo que você está lendo, assim você pode facilmente
corromper alguma informação da memória do computador fazendo com que sua aplicação não funcione. A propósito você pesquisou sobre o malloc?

C

Acho q sei mais ou menos como o malloc funciona…
Mas como já havia utilizado o fscanf dessa forma (a forma errada) outras vezes, achei que não havia problema. :?

Mas agradeço pelos esclarecimentos dos dois. =]

Criado 16 de março de 2011
Ultima resposta 17 de mar. de 2011
Respostas 5
Participantes 3