程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> C語言 模擬簡單printf的實現

C語言 模擬簡單printf的實現

編輯:關於C語言
 

#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()時設置計數器自加應該可以實現)。

 

 
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved