Jump to content
  • Revista PROGRAMAR: Já está disponível a edição #60 da revista programar. Faz já o download aqui!

Sign in to follow this  
Clint

Tirar acentos a uma string

Recommended Posts

Clint

Olá! Já à muito tempo (quase um ano) que eu não vinha aqui ao Fórum.

A minha dúvida é a seguinte:

Fiz duas funções, a primeira em Assembly Inline e a segunda em C++ convencional. O que as duas fazem é tirar os acentos a uma string, por exemplo:

Converter esta string: "Mário João Águeda" nesta: "Mario Joao Agueda".

void TiraAcentos(char* s)
{
__asm 
{
		mov ebx, s
		dec ebx

	Repeat:	add ebx, 1
		mov eax, [ebx]
		and eax, 0xff // 255
		cmp eax, 0x0 // '/0'
		je  Fim

		cmp eax, 0xc0 // 'À'
		jb  Repeat
		cmp eax, 0xe0 // 'à'
		jae LowerCase
		cmp eax, 0xc4 // 'Ä'
		jbe A
		cmp eax, 0xc7 // 'Ç'
		je C
		cmp eax, 0xcb // 'Ë'
		jbe E
		cmp eax, 0xcf // 'Ï'
		jbe I
		cmp eax, 0xd1 // 'Ñ'
		je N
		cmp eax, 0xd6 // 'Ö'
		jbe O
		cmp eax, 0xdc // 'Ü'
		jbe U

		mov BYTE PTR [ebx], 'Y'
		jmp Repeat

	A:	mov BYTE PTR [ebx], 'A'
		jmp Repeat
	C:	mov BYTE PTR [ebx], 'C'
		jmp Repeat
	E:	mov BYTE PTR [ebx], 'E'
		jmp Repeat
	I:	mov BYTE PTR [ebx], 'I'
		jmp Repeat
	N:	mov BYTE PTR [ebx], 'N'
		jmp Repeat
	O:	mov BYTE PTR [ebx], 'O'
		jmp Repeat
	U:	mov BYTE PTR [ebx], 'U'
		jmp Repeat

	LowerCase: cmp eax, 0xe4 // 'ä'
		jbe a_
		cmp eax, 0xe7 // 'ç'
		je c_
		cmp eax, 0xeb // 'ë'
		jbe e_
		cmp eax, 0xef // 'ï'
		jbe i_
		cmp eax, 0xf1 // 'ñ'
		je n_
		cmp eax, 0xf6 // 'ö'
		jbe o_
		cmp eax, 0xfc // 'ü'
		jbe u_

		mov BYTE PTR [ebx], 'y'
		jmp Repeat

	a_:	mov BYTE PTR [ebx], 'a'
		jmp Repeat
	c_:	mov BYTE PTR [ebx], 'c'
		jmp Repeat
	e_:	mov BYTE PTR [ebx], 'e'
		jmp Repeat
	i_:	mov BYTE PTR [ebx], 'i'
		jmp Repeat
	n_:	mov BYTE PTR [ebx], 'n'
		jmp Repeat
	o_:	mov BYTE PTR [ebx], 'o'
		jmp Repeat
	u_:	mov BYTE PTR [ebx], 'u'
		jmp Repeat

	Fim:
}
}

void TiraAcentos(char* s, int len)
{
for (int i = 0; i < len; i++)
	if (s[i] < 0)
		if (s[i] >= 'À' && s[i] <= 'Ý')
		{
			if (s[i] <= 'Ï')
			{
				if (s[i] <= 'Ç')
				{
					if (s[i] <= 'Ä')
						s[i] = 'A';
					else 
						s[i] = 'C';
				}
				else if (s[i] <= 'Ë')
					s[i] = 'E';
				else
					s[i] = 'I';
			}
			else if (s[i] <= 'Ö')
				{
					if (s[i] == 'Ñ')
						s[i] = 'N';
					else
						s[i] = 'O';
				}
				else if (s[i] <= 'Ü')
					s[i] = 'U';
				else 
					s[i] = 'Y';
		}
		else if (s[i] >= 'à')
		{
			if (s[i] <= 'ï')
			{
				if (s[i] <= 'ç')
				{
					if (s[i] <= 'ä')
						s[i] = 'a';
					else
						s[i] = 'c';
				}
				else if (s[i] <= 'ë')
					s[i] = 'e';
				else
					s[i] = 'i';
			}
			else if (s[i] <= 'ö')
				{
					if (s[i] == 'ñ')
						s[i] = 'n'; 
					else 
						s[i] = 'o';
				}
				else if (s[i] <= 'ü')
					s[i] = 'u';
				else 
					s[i] = 'y';
		}
}

Será que a função em Assembly está suficientemente bem optimizada para superar em desempenho a função em C++?

Gostava que me esclarecessem.

Share this post


Link to post
Share on other sites

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
Sign in to follow this  

×

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.