jset Posted April 12, 2012 at 09:10 AM Report #448729 Posted April 12, 2012 at 09:10 AM Boas pessoal, Eu tenho um problema com um ciclo for e não estou a perceber qual é... Ao entrar no 3º ciclo for ele faz a comparação da strings (no compilador da-me warning mas trabalha), mas ai pára todos os ciclos. O 1º ciclo só corre 1 vez, como eu faço para continuar a corre-lo... As variaveis s0,s1,s3 são strings. for(i=0;i<60; i++){ for(j=i;j<i+3;j++){ s1[j]=s3[j]; } for(k=0;k<10;k++){ if(!strcmp(s1,s0[0][k])){ printf("gsfgsdfhgsdf"); } } printf("%dfadfdf\n",i); } Se me poderem ajudar agradecia muito...
pikax Posted April 12, 2012 at 09:27 AM Report #448732 Posted April 12, 2012 at 09:27 AM Nao sei o que é exactamente a variavel "s0", mas o strcmp nao deveria de ser assim: //strcmp(s1,s0[0][k]); //caso o s0 seja char s0[50][50][50]; //strcmp(s1,s0[0]); //caso o s0 seja uma matriz de char s0[50][50]; strcmp(s1,s0); //caso o s0 seja uma "string" O 1º ciclo só corre 1 vez, como eu faço para continuar a corre-lo... mete um ciclo antes 🙂 Por muito mais que que estude só aprendo uma coisa, que ainda tenho muita coisa para aprender. A beleza de um código está em decompor problemas complexos em pequenos blocos simples. "learn how to do it manually first, then use the wizzy tool to save time." "Kill the baby, don't be afraid of starting all over again. Fail soon, learn fast."
pmg Posted April 12, 2012 at 09:31 AM Report #448733 Posted April 12, 2012 at 09:31 AM Não ignores os warnings. Se o compilador te dá um warning, corrige a situação! Assumindo que s0 é uma string (ou melhor, um array de caracteres que inclui um '\0'), s0[0][k] não faz sentido. What have you tried? Não respondo a dúvidas por PM A minha bola de cristal está para compor; deve ficar pronta para a semana. Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código!
jset Posted April 12, 2012 at 10:48 AM Author Report #448745 Posted April 12, 2012 at 10:48 AM a variavel s0 é um array de strings.. char *s0[][99] = {{"DFG", "DFR", "FGH"},{"dasdas","adads","asdsf"}} char s1[99],s3[]="DFGDRFSDFEBR"; eu quero pegar na s3, separar tres letras ex:DFG e comparar em s0, e no final quero que me devolva "dasdas" eu acho que o prob esta nos apontadores..
bsccara Posted April 12, 2012 at 11:24 AM Report #448748 Posted April 12, 2012 at 11:24 AM Se a inicialização das variáveis é feita como dizes, o programa não funciona. Repara que a variável 'i' vai até 59 e a 'j' até 61. A linha 's1[j]=s3[j];' vai inicializar parte da 's1' com lixo (a 's3' não tem tamanho para isso). Explica melhor o que era suposto o código fazer.
pmg Posted April 12, 2012 at 01:34 PM Report #448762 Posted April 12, 2012 at 01:34 PM Aparentemente queres comparar bocadinhos de s3 com elementos de s0[0]. Se encontrar uma igauldade, digamos, s[0][2], queres imprimir o elemento correspondente se s[1], ou seja s[1][2]. Certo? Ora bem ... o strcmp() não compara bocadinhos, só compara strings inteiras. Existe o strncmp() que compara bocadinhos. Vê lá se te serve. Atenção às terminações das strings!!! What have you tried? Não respondo a dúvidas por PM A minha bola de cristal está para compor; deve ficar pronta para a semana. Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código!
jset Posted April 12, 2012 at 02:16 PM Author Report #448767 Posted April 12, 2012 at 02:16 PM pmg é isso mesmo, obrigado pela dica da função vou experimentar.. Para ja isto esta a funcionar bem, mas só quando eu compilo com o compilador do Xcode em macOS.. E eu preciso usar o compilador gcc em linux, em linux ele corre, mas devolve-me caracteres estranhos na ultima string.. aqui esta o codigo #include <stdio.h> #include <string.h> #define T 99 int main (int argc, char * const argv[]) { char *s0[][T] = { { "GCU", "GCC", "GCA", "GCG"}, { "Dsdf", "Csdf", "Bsdf", "Asdf"} }; char s1[T],s4[T],s5[T],s6[T], s3[]="GCCGACGCGGCC"; int i,j,k; for(i=0;i<sizeof(s3); i=i+3){ for(j=0;j<3;j++){ s1[j]=s3[i+j]; } for(k=0;k<4;k++){ strcpy( s4,s0[0][k]); if(!strcmp(s1,s4)){ strcpy(s5,s0[1][k]); strcat(s6,s5); break; } } strcat(s6," "); } printf("\nstring final (%s)\n",s6); } o meu grande prob e passar caracteres da S0 um array de strings para uma string normal.
pmg Posted April 12, 2012 at 02:39 PM Report #448774 Posted April 12, 2012 at 02:39 PM Vê os meus comentários no meio do teu código ... aqui esta o codigo #include <stdio.h> #include <string.h> #define T 99 int main (int argc, char * const argv[]) { char *s0[][T] = { { "GCU", "GCC", "GCA", "GCG"}, { "Dsdf", "Csdf", "Bsdf", "Asdf"} }; char s1[T],s4[T],s5[T],s6[T], s3[]="GCCGACGCGGCC"; int i,j,k; Ate'aqui tudo bem ... eu usaria mais espaços 🙂 for(i=0;i<sizeof(s3); i=i+3){ Tens a certeza que queres o sizeof? O sizeof dum array não é a mesma coisa que o tamanho duma string! Neste caso especifico, o sizeof s3 é 13; e o comprimento da string é 12 (o array tem um byte "extra" com '\0'). Este loop vai correr uma vez mais do que tu estás à espera. Usa strlen(s3). for(j=0;j<3;j++){ s1[j]=s3[i+j]; } Então e o '\0'? Onde é que acaba a string s1? for(k=0;k<4;k++){ strcpy( s4,s0[0][k]); if(!strcmp(s1,s4)){ strcpy(s5,s0[1][k]); strcat(s6,s5); break; } } Ena tanta variavel auxiliar desnecessária :-) strcat(s6," "); } printf("\nstring final (%s)\n",s6); } Diverte-te! What have you tried? Não respondo a dúvidas por PM A minha bola de cristal está para compor; deve ficar pronta para a semana. Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código!
pikax Posted April 12, 2012 at 03:01 PM Report #448777 Posted April 12, 2012 at 03:01 PM a variavel s0 é um array de strings.. char *s0[][99] = {{"DFG", "DFR", "FGH"},{"dasdas","adads","asdsf"}} Se nao me engano o s0 e' um array de matrizes, que e' equivalente a "s[][][99]". Eu pessoalmente nao gosto muito dos nomes das variaveis... Acho que daria para simplificar muito o codigo com uma estrutura struct CombStr { char FindPalavra[100]; char ReturnPalavra[100]; }; //... CombStr stPalavras[50]; Com algumas funcoes pelo o meio para ajudar a fazer a pesquisa e etc, penso que ficaria o código mais simples(aka limpo) Por muito mais que que estude só aprendo uma coisa, que ainda tenho muita coisa para aprender. A beleza de um código está em decompor problemas complexos em pequenos blocos simples. "learn how to do it manually first, then use the wizzy tool to save time." "Kill the baby, don't be afraid of starting all over again. Fail soon, learn fast."
pmg Posted April 12, 2012 at 03:10 PM Report #448781 Posted April 12, 2012 at 03:10 PM char *s0[][99] = {{"DFG", "DFR", "FGH"},{"dasdas","adads","asdsf"}} Se nao me engano o s0 e' um array de matrizes, que e' equivalente a "s[][][99]". s0 é uma matriz de ponteiros. É um array cujos elementos são arrays (s0 tem dois elementos: s0[0] e so[1]). Estes elementos de s0, por sua vez são arrays cujos elementos são ponteiros. Cada um destes elementos tem espaço para 99 ponteiros. No caso especifico acima, os 3 primeiros são ponteiros para as strings dadas e os outros 96 são NULL. Arrays não são ponteiros, nem ponteiros são arrays. É aconselhada uma leitura do FAQ do comp.lang.c, especialmente a secção 6 :-) Eu pessoalmente nao gosto muito dos nomes das variaveis... Eu também não ... mas prontos ... What have you tried? Não respondo a dúvidas por PM A minha bola de cristal está para compor; deve ficar pronta para a semana. Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código!
pikax Posted April 12, 2012 at 03:31 PM Report #448787 Posted April 12, 2012 at 03:31 PM Se nao me engano o s0 e' um array de matrizes, que e' equivalente a "s[][][99]". s0 é uma matriz de ponteiros. É um array cujos elementos são arrays (s0 tem dois elementos: s0[0] e so[1]). Estes elementos de s0, por sua vez são arrays cujos elementos são ponteiros. Cada um destes elementos tem espaço para 99 ponteiros. No caso especifico acima, os 3 primeiros são ponteiros para as strings dadas e os outros 96 são NULL. Arrays não são ponteiros, nem ponteiros são arrays. É aconselhada uma leitura do FAQ do comp.lang.c, especialmente a secção 6 :-) eu sei que um apontador e' diferente de um array, quando se cria um array(ex: str[55]🙂 a variavel desse array("str") ira' ser um apontador para esse array. C nao tem suporte interno de strings, uma string e' um array. Nao conhecia o site, mas esta' um bocado dificil de aceder ao site, porque ele esta' a demorar um bocado a responder. #include <stdio.h> #include <string.h> int main (int argc, char * argv[]) { char str[99][99][99]={"asd"}; //array de matrizes char *pstr[99][99]={"asd"}; //apontador para matrizes char *pchar=&str[0][0][1]; //apontador para um char char *pSTR=str[0][0]; //apontador para um array printf("%s \n%s \nstrcmp = %d\n",str[0][0],pstr[0][0],strcmp(str[0][0],pstr[0][0])); printf("%c -> %s",*pchar,pSTR); } Por muito mais que que estude só aprendo uma coisa, que ainda tenho muita coisa para aprender. A beleza de um código está em decompor problemas complexos em pequenos blocos simples. "learn how to do it manually first, then use the wizzy tool to save time." "Kill the baby, don't be afraid of starting all over again. Fail soon, learn fast."
bsccara Posted April 12, 2012 at 03:55 PM Report #448793 Posted April 12, 2012 at 03:55 PM No caso especifico acima, os 3 primeiros são ponteiros para as strings dadas e os outros 96 são NULL. Julgo que te enganaste na parte dos NULL; no código a variável 's0' é local à função 'main', logo não será inicializada. Os elementos não inicializados da 's0' terão valores indefinidos.
pmg Posted April 12, 2012 at 04:00 PM Report #448794 Posted April 12, 2012 at 04:00 PM Julgo que te enganaste na parte dos NULL; no código a variável 's0' é local à função 'main', logo não será inicializada. Os elementos não inicializados da 's0' terão valores indefinidos. Em C não há "inicialização parcial". Um objecto ou é completamente inicializado ou é totalmente não inicializado. Por isso é que o "inicializador a zero universal" ({0}) funciona int x = {0}; double x = {0}; void *x = {0}; int x[4] = {0}; double x[4][5][6] = {0}; struct complicated_struct_with_arrays_and_pointers_inside x[1000] = {0}; Vê o ponto 6.7.8/19 no Standard C99: "all subobjects that are not initialized explicitly shall be initialized implicitly" (O mesmo texto está no Standard C11 em 6.7.9/19) What have you tried? Não respondo a dúvidas por PM A minha bola de cristal está para compor; deve ficar pronta para a semana. Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código!
pmg Posted April 12, 2012 at 05:52 PM Report #448818 Posted April 12, 2012 at 05:52 PM Nao conhecia o site, mas esta' um bocado dificil de aceder ao site, porque ele esta' a demorar um bocado a responder. Parece que o FAQ do comp.lang.c já está funcional ... What have you tried? Não respondo a dúvidas por PM A minha bola de cristal está para compor; deve ficar pronta para a semana. Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código!
bsccara Posted April 12, 2012 at 10:43 PM Report #448883 Posted April 12, 2012 at 10:43 PM Em C não há "inicialização parcial". Um objecto ou é completamente inicializado ou é totalmente não inicializado. Por isso é que o "inicializador a zero universal" ({0}) funciona Bem, está visto que tenho de actualizar os meus conhecimentos de C... 😄
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