#include<stdlib.h>
#include<stdio.h>
#include <stdarg.h>
//如果標准庫<stdlib.h>裡的itoa()函數可以用的話就不用自己寫my_itoa()函數了,我在自己的unix下不能用
char *my_itoa(int val, char *buf, int radix) //把val轉換成字符串,radix表示要轉換的進制
{
char *p = buf, *first, temp;
int digital;
if(val<0)
{
*p++='-';
val=-val;
}
first=p;
do //逐個字符賦值,注意是反序的
{
digital=val%radix;
val/=radix;
if(digital>9)
{
*p++=(char)(digital-10+'A');
}
else
{
*p++=(char)(digital+'0');
}
}while(val>0);
*p--='\0';
do //把反序正過來
{
temp = *p;
*p = *first;
*first=temp;
p--;
first++;
}while(first<p);
return buf;
}
void print(const char *fmt, ...)
{
const char *s;
int d;
char buf[16];
va_list ap;
va_start(ap, fmt);
while (*fmt)
{
if (*fmt != '%')
{
putchar(*fmt++);
continue;
}
switch (*++fmt)
{
case 's':
s = va_arg(ap, const char *);
for ( ; *s; s++)
{
putchar(*s);
}
break;
case 'd':
d = va_arg(ap, int);
my_itoa(d, buf, 10); //把int型值d轉換為10進制等價的的字符串
for (s = buf; *s; s++)
{
putchar(*s);
}
break;
default:
putchar(*fmt);
break;
}
fmt++;
}
va_end(ap);
}
int main(void)
{
int a=154;
char *p="adasd";
printf("%d\t%s\n", a, p);
printf("%d\t%s\t%s\n", 12, "abcde", "a");
return 0;
}
這個簡單的printf()只支持“%s”和“%d”格式的分類符,可以很容易擴展其他分類符號,不過要進行左對齊右對齊之類的估計就比較麻煩了,再想想。
C語言的標准要求printf()應該返回輸出字符串的數量。不過不經常用到這個返回值,這裡就懶得去計算實現了(在每次putchar()時設置計數器自加應該可以實現)。