Ver Mensaje Individual
  #8 (permalink)  
Antiguo 02/06/2005, 10:23
MaxExtreme
 
Fecha de Ingreso: abril-2005
Mensajes: 3.083
Antigüedad: 19 años, 1 mes
Puntos: 17
Para quien lo quiera para VC++ o una DLL para llamar y que sea rápido, he hecho una función estilo a las ANSI-C en inline ASM...

Código:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

/*******************************************
* Rellena con ceros a la izquierda - MaxExtreme
*
**** Argumentos ****
* numero - Número origen al que se añadirán ceros
* destino - Puntero donde se guardará el resultado
* cifras - Cifras totales que tendrá la string destino
*
**** Devuelve ****
* ret==0	OK
* ret!=0	ERROR
******************************************/
int Rellenar(int numero, char * destino, int cifras)
{
	static char buffer[11];

	__asm
	{
		pusha

		lea edx, buffer
		push 10d
		push edx
		push numero
		call itoa
		add esp, 0Ch
		push eax
		call strlen
		pop edx

		mov ebx, destino
		mov ecx, cifras
		mov byte ptr [ebx+ecx], 0h
		sub ecx, eax
		mov edx, ecx

		cmp eax, cifras
		jg error
		je igual

ceros:		mov byte ptr [ebx+ecx-1], 30h
		loop ceros

igual:		add ebx, edx
		mov ecx, eax
		lea edx, buffer
num:		mov al, byte ptr [edx+ecx-1]
		mov byte ptr [ebx+ecx-1], al
		loop num


		popa
		mov eax, 0h
		jmp fin

error:		popa
		mov eax, 1h

fin:
	}
}



void main()
{
	// Rellenamos parte de la cadena para comprobar que se incluye el terminador \0
	char destino[100]="xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";

	// Rellenamos con el número 12345 con 10 cifras -> OK
	if(Rellenar(12345,destino,10)==0)	printf("%s\n",destino);
	else						printf("Error\n");

	// Rellenamos con el número 12345 con 5 cifras -> OK
	if(Rellenar(12345,destino,5)==0)	printf("%s\n",destino);
	else						printf("Error\n");

	// Rellenamos con el número 12345 con 3 cifras -> ERROR
	if(Rellenar(12345,destino,3)==0)	printf("%s\n",destino);
	else						printf("Error\n");
}
Ese ejemplo devuelve lo que se espera:
Código:
0000012345
12345
Error
No sé si se puede optimizar más, pero ahí queda como curiosidad...

** EDIT: pops sustituidos por add dado que itoa devuelve el puntero que se le pasa y por lo tanto lo tenemos en eax para hacer push a strlen sin usar edx - Eternal Idol

Última edición por MaxExtreme; 02/06/2005 a las 14:01