printf函數簡潔實現


#include <stdarg.h>
#include <stdlib.h>
#include <stdio.h>

int My_putchar(int ch)
{
	HalSerial_UARTWrite((uint8 *)&ch, 1);
	return ch;
}

char* My_itoa(int value,char str[],int radix) 
{ 
	char temp[33]; 
	char *tp = temp; 
	int i; 
	unsigned v; 
	int sign; 
	char *sp; 
	if(radix > 36 || radix < 1) 
		return 0; 
	sign = (radix == 10 && value < 0); //十進制負數 
	if(sign) 
		v = -value; 
	else 
		v = (unsigned)value; 
	while(v || tp == temp)       //轉化操作 
	{ 
		i = v % radix; 
		v = v / radix; 
		if(i < 10) 
			*tp++ = i + '0'; 
		else 
			*tp++ = i + 'A' - 10; 
	} 
	if(str == 0) 
		str = (char*)malloc((tp - temp) + sign + 1); 
	sp = str; 
	if(sign)   //是負數的話把負號先加入數組 
		*sp++ = '-'; 
	while(tp > temp) 
		*sp++ = *--tp; 
	*sp = 0; 

	return str; 
} 

int printf(const char *fmt, ...)
{
	const char *s;
	int d;
	char buf[16];
	va_list ap;
	va_start(ap, fmt);
	while (*fmt) {
		if (*fmt != '%') {
			My_putchar(*fmt++);
			continue;
		}
		switch (*++fmt) {
			case 's':
				s = va_arg(ap, const char *);
				for ( ; *s; s++) {
					My_putchar(*s);
				}
				break;
			case 'd':
				d = va_arg(ap, int);
				My_itoa(d, buf, 10);
				for (s = buf; *s; s++) {
					My_putchar(*s);
				}
				break;
			case 'X':
				d = va_arg(ap, int);
				My_itoa(d, buf, 16);
				for (s = buf; *s; s++) {
					My_putchar(*s);
				}
				break;
				/* Add other specifiers here... */             
			default: 
				My_putchar(*fmt);
				break;
		}
		fmt++;
	}
	va_end(ap);
	return 1;   /* Dummy return value */
} 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章