Jump to content

Problemas Com Ciclos..


Recommended Posts

Posted

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...

Posted

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."

Posted

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!

Posted

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..

Posted

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.

Posted

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!

Posted

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.

Posted

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!

Posted

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."

Posted

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!

Posted

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."

Posted

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.

Posted

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!

Posted

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!

Posted

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... 😄

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.