Ir ao conteúdo
  • Cadastre-se
Fabricio Lisboa Franco

Problema no for

Recommended Posts

    Pessoal bom dia. Ontem na faculdade apareceu um desafio, um exercício sobre cubo mágico, em que devo contar quantos passos serão necessários para voltar o cubo para seu estado original. Criei matrizes para cada face, onde eu trabalho com a alteração dos valores dos "extremos" para que depois eu consiga detectar as mudanças.

    Cada Letra inserida de uma string que eu entro no início, é um giro (sentido horário ou antihorário) no cubo em uma das faces. Cada letra é uma face. Porém o que acontece é que, quando eu vou detectar cada letra e chamar o método de mudar a face, ele para ali naquele if e não verifica os outros, mesmo estando dentro do for. 

    Se eu entro por exemplo com: U (muda apenas 1 face) ocorre td normal. Mas quando eu entro com 2 letras: UR por exemplo, ele só mexe em uma face (da letra U).

    Código: 

int main(int argc, char *argv[]) {		// inicializa c/ valores padrão	inicializaMatrizes();		int i; 	char sequencia[] ="";	char *partes;		// Letras válidas: U F D R L B 	scanf("%s", &sequencia);		for(i=0;i<sizeof(sequencia);i++)	{		//printf("%c\n", sequencia[i]);				if(sequencia[i] == 'U') // sentido horario		{			mudaFace(sequencia[i]);			printf("Entrou U\n");		}		if(sequencia[i] == 'F')		{			mudaFace(sequencia[i]);			printf("Entrou F\n");		}		if(sequencia[i] == 'D')		{			mudaFace(sequencia[i]);			printf("Entrou D\n");		}		if(sequencia[i] == 'R')		{			mudaFace(sequencia[i]);			printf("Entrou R\n");		}		if(sequencia[i] == 'L')		{			mudaFace(sequencia[i]);			printf("Entrou L\n");		}		if(sequencia[i] == 'u')		{			mudaFace(sequencia[i]);			printf("Entrou u\n");		}		if(sequencia[i] == 'f')		{			mudaFace(sequencia[i]);			printf("Entrou f\n");		}		if(sequencia[i] == 'd')		{			mudaFace(sequencia[i]);			printf("Entrou d\n");		}		if(sequencia[i] == 'r')		{			mudaFace(sequencia[i]);			printf("Entrou r\n");		}		if(sequencia[i] == 'l')		{			mudaFace(sequencia[i]);			printf("Entrou l\n");		}					}			mostraValores();	//checaMudancas(); // mostra faces modificadas			return 0;}

Compartilhar este post


Link para o post
Compartilhar em outros sites

scanf("%s", &sequencia), isso esta mal, o correto seria scanf("%s", sequencia) sem &. Arrume isso e me conte como ficou.

 

E isso aqui nao podemos fazer nunca(char sequencia[] ="";) e depois "scanf("%s", sequencia)", você nao reservou nenhum espaço para sequencia?? Si isso chegar a funcionar que tamanho tem sequencia?

 

Quando fazemos char palavra[] ="Alo mundo!" palavra toma automaticamente o tamanho de 11 letras + caracter NULL ('\0') que marca o fin do string, porém isso só é possivel fazer na hora da declaraçao.

 

Si fizer char sequencia[] ="", supondo que o compilador nao emita erros por nao estipular um valor entre [], ao nao ter letra nenhuma entre " e " nem imagino que valor toma essa variavel, porém podemos saber com printf("%d", sizeof(palavra)/sizeof(palavra[0]) ). Logo depois do printf podemos saber quantas letras podem ser armazenadas, porém agora nao posso comprovar por que meu pc esta quebrado e estou sem compilador adiante, logo mais tarde comprovo para ver o resultado.

 

Solucione o anterior que é o mais importante.

Compartilhar este post


Link para o post
Compartilhar em outros sites

    Cara eu fiz essa medição que você falou (do tamanho do vetor de char) e deu no resultado que você tinha falado, testei com UUU e o tamanho veio 1, teria que dar 3 porque tem 3 elementos: 3x1=3. como eu declaro esse vetor de char essa que e minha dúvida, de modo com que meu código consiga passar por todos os ifs, essa é que é minha dúvida. 

    É muito difícil eu mexer com c mas foi um exercicio passado em sala. 

Compartilhar este post


Link para o post
Compartilhar em outros sites

você pode declarar ele assim: char sequencia[4] ="";. Por que 4? porque sempre quando seja char devemos deixar 1 a mais para o caracter nulo. si você repetir o processo com char sequencia[] ="Ola"; e voltar a comprovar, você vai ver que sequencia tem 3 letras porém te vai devolver 4, por causa do nulo "oculto" que marca o final do texto. Por que existe esse nulo? fácil... si declaramos char sequencia[500] =""; e depois guardar nele um simples "Ola". Como vai saber printf, onde tem que parar de imprimir? Pois o printf vai parar justo nesse caracter nulo, tente imprimir isso "Ola\0 mundo!" e veja como printf se detem justo nesse \0. isso quer dizer que si queremos imprimir "Ola mundo!" o nosso texto ganha \0 logo no final de usar scanf, ou na mesma hora de declarar char sequencia[] ="Alo mundo!" e outras tantas funçoes. O que acontece é que esse processo é oculto para nós programadores, porém devemos ter conhecimento disso. Quando eu entrar por teclado ou na hora de declarar un texto como "Alo mundo!", no buffer ele vai estar "Alo mundo!\0".

 

E outra coisa, nao devemos nunca ocupar a ultima casinha de um char, por que si nao o programa vai por o nulo fora do array, si declaro char sequencia[3] ="Alo", a ultima casinha é sequencia[2], pois o programa vai pegar e colocar o nulo na casinha sequencia[3]. ISSO É MUITO PERIGOSO NAO FAÇA ISSO!!! você esta saindo fora do rango sen saber.

 

Si precisar de 10 chars declare 11 porém somente use os 10 ok. Pode fazer isso: char sequencia[10+1] ="". Legal né?

 

Outra coisa.. si fizer char sequencia[500] =""; as 500 casinhas fican formatadas com NULL, ou seja sem lixo. Isso é por causa das aspas "" que dicen que toda a cadeia de caracteres fique com formato NULL.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora





Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas publicações sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×