lesiano Posted June 17, 2008 at 06:55 PM Report Share #191743 Posted June 17, 2008 at 06:55 PM Boas; Esta é uma daquelas dúvidas q me aparece mais frequentemente; Qd declaro um array de chars ñ faço puto de ideia do input q vou ter e ñ sei o tamanho. Normalmente meto uma carrada de '9's, mas é escusado. Reparem neste: #include <stdio.h> #include <string.h> #define MAXWORD 1000; int main(){ char cadeiaDNA[100]; int i; printf("Introduza a cadeia de DNA:\n"); scanf("%s",&cadeiaDNA); for (i=0;cadeiaDNA[i]!='\0';i++){ if (cadeiaDNA[i] == 'T'){ cadeiaDNA[i] = 'A'; } } printf("%s",cadeiaDNA); getch(); } i) Como viram defini uma MAXWORD. Ñ a consigo pôr dentro dos "[" "]" do array. Porquê? ii) O código vai ser submetido a outro programa q lhe dará muitos inputs. Para contornar a eventualidade de ele receber uma string de maior tamanho q os tais 99 dos 100 chars definidos, o q posso fazer? Obg. Link to comment Share on other sites More sharing options...
Baderous Posted June 17, 2008 at 07:08 PM Report Share #191747 Posted June 17, 2008 at 07:08 PM A directiva #define não leva ; (ponto e vírgula) no final. Para o problema do input, podes optar por construir a string dinamicamente com o malloc. Link to comment Share on other sites More sharing options...
lesiano Posted June 17, 2008 at 07:25 PM Author Report Share #191751 Posted June 17, 2008 at 07:25 PM A directiva #define não leva ; (ponto e vírgula) no final. Para o problema do input, podes optar por construir a string dinamicamente com o malloc. Obg pela correcção, nd q eu ñ saiba, mas foi distracção pura. Daí ñ dar para pôr dentro do tamanho do array. Neste caso em específico, podias dar-me um exemplo de como fazer isto com o malloc, sff? Obg. (Já agr:) char array[malloc(sizeof(scanf("%s",&array))] Qq cosia assim? Ainda só estudei até funções. Listas ligadas e estruturas, tal como ficheiros, passam-me, por enquanto, ao lado. Link to comment Share on other sites More sharing options...
Rui Carlos Posted June 17, 2008 at 07:32 PM Report Share #191755 Posted June 17, 2008 at 07:32 PM Para o malloc: int tamanho=150; char *array=(char*)malloc(tamanho*sizeof(char)); Rui Carlos Gonçalves Link to comment Share on other sites More sharing options...
nata79 Posted June 17, 2008 at 09:38 PM Report Share #191790 Posted June 17, 2008 at 09:38 PM penso que a ideia era leres do stdinput uma string cujo tamanho desconheces, para fazer isso penso que a única alternativa seja leres caracter a caracter para uma lista ligada... pelo menos era assim que eu faria! ps: LI2 arithmeticoverflow.wordpress.com Link to comment Share on other sites More sharing options...
fabiim Posted June 17, 2008 at 09:41 PM Report Share #191792 Posted June 17, 2008 at 09:41 PM Se tiveres a usar a libc: int main() { char *buffer[1]; size_t to_read = 0; char *seq; buffer[0] = NULL; getline(buffer,&to_read,stdin); if (buffer[0] != NULL ) seq = buffer[1]; else erro(); } O código acima dá para ler linhas (acabadas em \n) de qualquer tamanho, a getline retorna 1 se não arranjar espaço para a sequência ou se encontrar EOF (um carácter que indica o fim do ficheiro) (isto pode ser tricky se estiver a ler de um ficheiro de texto, que nao tem newline no fim); A string final tem um '\n' nao te esqueças!. Mais standard tens esta hipotese: char *fgetseq(FILE *fp) { char *seq; char c; int i; /* 1 arranjamos espaco dinamicamente para um caracter */ seq = (char *) malloc(sizeof(char)); for (i=0, c = getc(fp) ; (c!= EOF) && (c!= '\n'); i++, c=getc(fp) ) { seq[i] = c; /* a realloc() aumenta um espaco apontado por um ptr, o espaco novo (maior ) pode estar num sitio diferente logo e preciso fazzer a atribuicao novamente */ seq = realloc(seq,sizeof(char)*(i+1)); if (seq == NULL) return NULL; } seq[i] = '\0'; return seq; } E já agora, eu tou a fazer o mesmo trabalho, julgo que a ideia seja só ler uma sequência de tamanho desconhecido apenas de um ficheiro, segundo o meu prof, o ficheiro apenas continha uma sequência, e podia-se resolver o problema com uma chamada á malloc, o tamanho era determinado sabendo apenas o tamanho do ficheiro. Depois era apanhar com um fgets, ou cena assim. Acho que c/ a getline ou a que apresentei acima temos uma solução menos limitada. Link to comment Share on other sites More sharing options...
Rui Carlos Posted June 17, 2008 at 09:51 PM Report Share #191794 Posted June 17, 2008 at 09:51 PM Estar constantemente a fazer um realloc para alocar mais 1 byte é capaz de não ser muito boa ideia... Rui Carlos Gonçalves Link to comment Share on other sites More sharing options...
fabiim Posted June 17, 2008 at 09:55 PM Report Share #191795 Posted June 17, 2008 at 09:55 PM Estar constantemente a fazer um realloc para alocar mais 1 byte é capaz de não ser muito boa ideia... porquê? Link to comment Share on other sites More sharing options...
Rui Carlos Posted June 17, 2008 at 10:16 PM Report Share #191799 Posted June 17, 2008 at 10:16 PM porquê? Porque corres o risco de, de cada vez que lê um caracter, teres de copiar todos os caracteres já lidos para um nova localização. E se tiveres uma quantidade considerável de caracteres, isso terá consequências notórias no desempenho. Rui Carlos Gonçalves Link to comment Share on other sites More sharing options...
TheDark Posted June 18, 2008 at 02:32 AM Report Share #191837 Posted June 18, 2008 at 02:32 AM No teu primeiro código, com char *buffer[1]; estás a declarar um array com uma posição, e com buffer[1] = NULL; a escrever na 2ª posição, lendo mais à frente dessa 2ª posição. Tens a certeza que o código funciona? não devias estar a ler de e escrever para buffer[0]? Desaparecido. Link to comment Share on other sites More sharing options...
fabiim Posted June 18, 2008 at 08:28 AM Report Share #191850 Posted June 18, 2008 at 08:28 AM No teu primeiro código, com char *buffer[1]; estás a declarar um array com uma posição, e com buffer[1] = NULL; a escrever na 2ª posição, lendo mais à frente dessa 2ª posição. Tens a certeza que o código funciona? não devias estar a ler de e escrever para buffer[0]? Tens razão, não funciona como estava. Já modifiquei. Porque corres o risco de, de cada vez que lê um caracter, teres de copiar todos os caracteres já lidos para um nova localização. E se tiveres uma quantidade considerável de caracteres, isso terá consequências notórias no desempenho. Pois, tb tens razão. Podia meter um ciclo e aumentar de 100 em 100 letras ou coisa parecida, e depois no final re-ajustar mas aí já não ia gostar muito da função. Haverá uma forma mais simples de resolver isso então ? Link to comment Share on other sites More sharing options...
Rui Carlos Posted June 18, 2008 at 08:47 AM Report Share #191851 Posted June 18, 2008 at 08:47 AM Pois, tb tens razão. Podia meter um ciclo e aumentar de 100 em 100 letras ou coisa parecida, e depois no final re-ajustar mas aí já não ia gostar muito da função. Haverá uma forma mais simples de resolver isso então ? Aquilo que eu normalmente faço, é duplicar o tamanho do array, quando já não há posições disponíveis. É claro que acabam por ficar com muitas posições livres. Podes recorrer a soluções de compromisso, como aumentar o tamanho do array em 10%, por exemplo. O que acho essencial, é que o tamanho do novo espaço dependa do tamanho actual do array, de forma a que a função não tenha quebras significativas na eficiência caso haja muito caracteres para ler. Rui Carlos Gonçalves Link to comment Share on other sites More sharing options...
lesiano Posted June 18, 2008 at 01:40 PM Author Report Share #191904 Posted June 18, 2008 at 01:40 PM Para o malloc: int tamanho=150; char *array=(char*)malloc(n*sizeof(char)); Acabei por ñ perceber o q é o "tamanho", se ñ está relacionado com o array. Podes adaptar esse código ao meu, sff? Eu depois pesquiso mais sobre esse assunto, mas agr realmente ñ estou a ver como o adaptar. Link to comment Share on other sites More sharing options...
Rui Carlos Posted June 18, 2008 at 01:43 PM Report Share #191907 Posted June 18, 2008 at 01:43 PM O tamanho é uma variável. Podes usar um scanf para colocar lá o valor que quiseres. Rui Carlos Gonçalves Link to comment Share on other sites More sharing options...
TheDark Posted June 18, 2008 at 08:15 PM Report Share #192007 Posted June 18, 2008 at 08:15 PM A variável tamanho na declaração e a n no malloc devem ser a mesma. Desaparecido. Link to comment Share on other sites More sharing options...
Rui Carlos Posted June 18, 2008 at 08:22 PM Report Share #192013 Posted June 18, 2008 at 08:22 PM A variável tamanho na declaração e a n no malloc devem ser a mesma. Pois ? Nem tinha reparado nisso... Rui Carlos Gonçalves Link to comment Share on other sites More sharing options...
lesiano Posted June 19, 2008 at 03:18 PM Author Report Share #192187 Posted June 19, 2008 at 03:18 PM Pois ? Nem tinha reparado nisso... Daí eu ñ ter percebido o esquemático. 😉 Link to comment Share on other sites More sharing options...
lesiano Posted July 2, 2008 at 11:11 PM Author Report Share #195126 Posted July 2, 2008 at 11:11 PM #include <stdio.h> #include <stdlib.h> main(){ char *p; int tamanho,i=1,t; p=(char *)malloc(tamanho*sizeof(char)); if (!p){ printf ("** Erro: Memoria Insuficiente **"); exit; } for(i=0;(i<tamanho);i++){ scanf("%c",&p[i]); } for(t=0;(t<i);t++){ putchar(p[t]); } getch(); } Esta cena agr aloca dinamicamente. Mas... como fazer aqui o realloc para ele adicionar smp espaço alocado se surgirem mais de 10 caracteres? Obg. Link to comment Share on other sites More sharing options...
Rui Carlos Posted July 2, 2008 at 11:28 PM Report Share #195131 Posted July 2, 2008 at 11:28 PM Era capaz de ser melhor usares uma função que te lesse logo n caracteres de cada vez... No final, e metias a função dentro de um ciclo, que via se tinhas lido um '\n', e caso não tivesse acontecido, alocavas mais espaço e chamavas outra vez a função de leitura. Rui Carlos Gonçalves Link to comment Share on other sites More sharing options...
lesiano Posted July 3, 2008 at 01:54 AM Author Report Share #195150 Posted July 3, 2008 at 01:54 AM #include <stdio.h> #include <stdlib.h> main(){ char *p; int tamanho=10,i,t=1,h; p=(char *)malloc(tamanho*sizeof(char)); if (!p){ printf ("** Erro: Memoria Insuficiente **"); exit; } tamanho=10; for(i=0;(p[i-1]!='\n');i++){ if(i==(tamanho-1)){ tamanho += tamanho; p=(char*)realloc(p,tamanho*sizeof(char)); } scanf("%c",&p[i]); } for(t=0;(t<i);t++){ putchar(p[t]); } getch(); } Acabei por descobrir. 😁 Mts tentativas, mas quem corre por gosto ñ cansa. Assim, está bom em termos de desempenho? Há alternativas mais fiáveis? Obg. Link to comment Share on other sites More sharing options...
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now