Jump to content
killezio

Ler string de tamanho variável com scanf

Recommended Posts

killezio

ora bem, eu queria armazenar num apontador uma string cujo tamanho eu só sei depois de o ler num ficheiro de texto.

imaginemos que eu guardei o tamanho dessa string numa variável D

agora eu quero ler a string toda de uma vez ( que também está no ficheiro de texto) sabendo já qual o tamanho dela.

pensei em fazer assim

fscanf("read,%.3s",word);

onde o 3 é realmente o tamanho da string, mas isso eu já sei por ler o ficheiro antes de escrever o código. Como é que eu faria para o "3" em "%.3s" ser uma variável?

Edited by killezio

Share this post


Link to post
Share on other sites
pwseo

killezio,

O mais acertado (parece-me) será criar um buffer suficientemente grande para leres a string de uma vez. Se esse buffer for alocado via malloc e não for suficiente para ler a string, podes sempre reallocar para aumentar o tamanho e ler o que falta da string.

De qualquer modo, a menos que estejas a ler um documento inteiro enorme para dentro de uma única string, penso que a opção mais sensata é mesmo criar um espaço grande o suficiente, mesmo que isso te gaste alguns bytes de memória a mais.

Share this post


Link to post
Share on other sites
killezio

killezio,

O mais acertado (parece-me) será criar um buffer suficientemente grande para leres a string de uma vez. Se esse buffer for alocado via malloc e não for suficiente para ler a string, podes sempre reallocar para aumentar o tamanho e ler o que falta da string.

De qualquer modo, a menos que estejas a ler um documento inteiro enorme para dentro de uma única string, penso que a opção mais sensata é mesmo criar um espaço grande o suficiente, mesmo que isso te gaste alguns bytes de memória a mais.

como estou preocupado com a performance do programa queria fazer as coisas no limite, mas obrigado pela sugestão :)

Share this post


Link to post
Share on other sites
HappyHippyHippo

como estou preocupado com a performance do programa queria fazer as coisas no limite, mas obrigado pela sugestão :)

e sabes o "tempo" que estás a perder a determinar o tamanho da string no ficheiro ?


IRC : sim, é algo que ainda existe >> #p@p

Share this post


Link to post
Share on other sites
pwseo

Já dizia o sr Knuth:

Programmers waste enormous amounts of time thinking about, or worrying about, the speed of noncritical parts of their programs, and these attempts at efficiency actually have a strong negative impact when debugging and maintenance are considered. We should forget about small efficiencies, say about 97% of the time: premature optimization is the root of all evil. Yet we should not pass up our opportunities in that critical 3%.

Além disso, no teu caso estás efectivamente a prejudicar a performance com os passos adicionais para determinar o tamanho da string, alocar a memória convenientemente, ler a string (novamente) e libertar a memória no final.

Share this post


Link to post
Share on other sites
killezio

eu preciso de saber o tamanho da string, aliás o tamanho é dado. No problema que estou a tentar resolver testam se fizeste bem e se o programa corre relativamente rápido. eles dão me muitas strings mas em cada uma também me dão o tamanho delas. se o tamanho é dado e só custa ao processador ler um short int num ficheiro de texto para saber o tamanho ( para nao falar que vou precisar do tamanho para outra coisa mais tarde) então decidi ir por aí.

ora aqui surgiu outra dúvida, eu pretendo guardar cada string num vetor de apontadores mas não estou a conseguir, aqui está o código devidamente comentado:

#include <stdio.h>
void read_top(FILE **read,short int *L, short int *D, short int *N){
   fscanf(*read,"%hd %hd %hd",L,D,N); // sendo L o tamanho das strings e D quantas strings vou ler, o resto nao interessa para a dúvida
   fgetc(*read); // retirar o \n
}
void save_words(FILE **read,char **dic,short int L,short int D){ // o problema está nesta função
   int e;
   for (e = 0;e < D;e++){
       fgets((*dic)[e],L+1,*read); // já sabendo o tamanho das strings que quero ler, L, queria ler uma de cada vez e guardar no vetor de apontadores "dic" mas não estou a conseguir. é aqui que preciso de ajuda
       fgetc(*read); // pasasr o \n à frente
   }
}
void abrir(FILE **read,FILE **write) {
   *read = fopen("teste4.in","r");
   *write = fopen("Allien_language","w");
}
main(){
   FILE *read,*write;
   abrir(&read,&write);
   short int L,D,N;
   read_top(&read,&L,&D,&N);
   char *dic[D]; // vetor de apontadores
   save_words(&read,dic,L,D); // é nesta função que estou a ter problemas
   //printf("\nL = %hd\nD = %hd\nN = %hd\n",L,D,N);
   //printf("\n%s\n",dic[0]);
}

Edited by thoga31
GeSHi

Share this post


Link to post
Share on other sites
HappyHippyHippo

o primeiro argumento da função fgets necessita que passes um endereço de memória válido para uma região já reservada, o que não está a acontecer


IRC : sim, é algo que ainda existe >> #p@p

Share this post


Link to post
Share on other sites
killezio

a processar xd

bem, o que estava a fazer mal era o fgets, realmente tinha que mandar dic[e] em vez de *dic[e]. fix também um malloc para o dic[e] de tamanho <L+1> para ocupar pouco espaço na memória na linha atrás do fgets.

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.