Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

gRoOvE

[Resolvido] strcmp na unha...

Recommended Posts

estou tentando implementar esta função na unha, eis o que consegui fazer, não sei se estou no caminho certo, ta dificil pra acertar a lógica quando S1 > S2 e S2 > S1, se alguém puder dar uma ajuda :D

 

int ComparaString(char *string1, char *string2)
{
	int i = 0;
	int str1 = 0, str2 = 0;
	int maior = 0, menor = 0;
	int igual = 0;
	while((i < ContaString(string1)) || (i < ContaString(string2)))
	{
		if(*(string1+i) == *(string2+i))
		{
			str1 = str1 + (int)*(string1+i);
			str2 = str2 + (int)*(string2+i);
			igual++;
		}
		else if(*(string1+i) > *(string2+i))
		{
			str1 = str1 + (int)*(string1+i);
			str2 = str2 + (int)*(string2+i);
			maior++;
		}
		else if(*(string1+i) < *(string2+i))
		{
			str1 = str1 + (int)*(string1+i);
			str2 = str2 + (int)*(string2+i);
			menor++;
		}
		i++;
	}
	if((str1 == str2) && (ContaString(string1) == igual))
	{
		return(0);
	}
	else if((str1 == str2) && (maior > menor))
	{
		return(1);
	}
	else if((str1 == str2) && (menor > maior))
	{
		return(-1);
	}
	else if((str1 > str2) && (maior > 0))
	{
		return(1);
	}
	else if((str1 < str2) && (menor > 0))
	{
		return(-1);
	}
}

Compartilhar este post


Link para o post
Compartilhar em outros sites

Eu acho que tem um jeito mais fácil de fazer isso.

 

Se voce comparar caracteres. Ex: 'a' > 'b'

Isso será falso, pois 'a' tem um valor ascii menor que 'b'.

 

Tomando isso como ponto de partida voce pode comparar caracteres na busca pela igualdade. Se os caracteres forem iguais continue a comparação senão ache quem é maior. O caracter da string1 ou o caracter da string2 ai retorne o que tiver que retornar.

 

Não sei se ficou claro.

 

Ps: não precisa passar por todos os caracteres. Quando achar um maior que o outro já pode retornar.

 

http://forum.imasters.com.br/public/style_emoticons/default/thumbsup.gif

Compartilhar este post


Link para o post
Compartilhar em outros sites

Boas dicas, consegui resolver, veja se é possível otimizar mais um pouco. Estava meio confuso de como funcionava essa parte de uma string ser maior que a outra, pensei que tivesse que comparar todos os caracters "/

 

int ComparaString(char *string1, char *string2)
{
	int i = 0;
	int igual = 0;
	while((i < ContaString(string1)) || (i < ContaString(string2)))
	{
		if(*(string1+i) == *(string2+i))
		{
			igual++;
		}
		else if(*(string1+i) > *(string2+i))
		{
			return(1);
		}
		else if(*(string1+i) < *(string2+i))
		{
			return(-1);
		}
		i++;
	}
	if(ContaString(string1) == igual)
	{
		return(0);
	}
}

Compartilhar este post


Link para o post
Compartilhar em outros sites

Vamos a um exemplo.

 

string1 = "Imasters";

string2= "ImastersForum";

 

Isso no final do seu programa vai retornar 0 e não deveria, pois string2 é maior que string1.

Ve se consegue resolver.

 

Dica: Faça um teste na saída do laço comparando tamanho das strings.

 

http://forum.imasters.com.br/public/style_emoticons/default/thumbsup.gif

 

Como assim uma string estar contida na outra?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Aliás, qual a utillidade de quando você comparar as strings, saber que uma é "maior" ou "menor" que a outra? Sempre que usei esta função, só uso pra verificar se são idênticas

Compartilhar este post


Link para o post
Compartilhar em outros sites

Vamos a um exemplo.

 

string1 = "Imasters";

string2= "ImastersForum";

 

Isso no final do seu programa vai retornar 0 e não deveria, pois string2 é maior que string1.

Ve se consegue resolver.

 

Dica: Faça um teste na saída do laço comparando tamanho das strings.

 

http://forum.imasters.com.br/public/style_emoticons/default/thumbsup.gif

 

Como assim uma string estar contida na outra?

Ah isso eu já tratei, veja, tem uma variável chamada "igual", que vai incrementando a cada iteração que a comparação dos caraters são iguais, ai no final pra retornar 0, o valor da variável "igual" tem que ser igual ao número de iterações :D

Compartilhar este post


Link para o post
Compartilhar em outros sites

Faça os testes e verifique se está mesmo correto.

Se estiver é isso ai.

 

Ah isso eu já tratei, veja, tem uma variável chamada "igual", que vai incrementando a cada iteração que a comparação dos caraters são iguais, ai no final pra retornar 0, o valor da variável "igual" tem que ser igual ao número de iterações

Pode usar essa função para fazer ordenação de strings.

 

Aliás, qual a utillidade de quando você comparar as strings, saber que uma é "maior" ou "menor" que a outra? Sempre que usei esta função, só uso pra verificar se são idênticas

http://forum.imasters.com.br/public/style_emoticons/default/thumbsup.gif

Compartilhar este post


Link para o post
Compartilhar em outros sites

hmm, saquei ^^

Então, eu coloquei a função original e a minha, testei de várias formas e as duas retornar valores iguais, acredito que seja isso ^^

vlw Kandrade :D

Compartilhar este post


Link para o post
Compartilhar em outros sites

Mas ta gerando um warning aqui, diz que pode em alguma ocasião não retornar nada...mas como vou descobrir?

 

warning C4715: 'ComparaString' : not all control paths return a value

Compartilhar este post


Link para o post
Compartilhar em outros sites

Se passar pelo loop sem retornar será executado esse teste:

if(ContaString(string1) == igual)

Só assim terá retorno.

Se o teste for falso qual retorno a função deve ter?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Eu entendi o que você quis dizer, mas se o teste for falso, já terá retornado dentro do laço mesmo...não tem pq colocar um else ali, seria só pra retirar o warning msm...

Compartilhar este post


Link para o post
Compartilhar em outros sites

Voce encerra o laço quando string1 ou string2 atinge o tamanho dela.

Imagine string2 com menos caracteres que string1 cai naquele caso que te falei só que o inverso.

 

string2 = "Imasters"

string1 = "ImastersForum"

 

entendeu?

 

Eu entendi o que você quis dizer, mas se o teste for falso, já terá retornado dentro do laço mesmo...não tem pq colocar um else ali, seria só pra retirar o warning msm...

Compartilhar este post


Link para o post
Compartilhar em outros sites

ta mais se string2 for menor que string1, já está previsto dentro do for, e já vai encerrar a função por lá mesmo

Compartilhar este post


Link para o post
Compartilhar em outros sites

Se passar pelo loop sem retornar será executado esse teste:

if(ContaString(string1) == igual)

Só assim terá retorno.

Se o teste for falso qual retorno a função deve ter?

Cite um exemplo, onde este teste seja falso.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Só agora que fui rodar o código.

A única coisa que eu faria é tirar o último if.

 

Se o programa passar pelo laço as strings são iguais retorne 0.

 

 

ta mais se string2 for menor que string1, já está previsto dentro do for, e já vai encerrar a função por lá mesmo

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.