[c語言] 模擬實現printf,要求功能: my_printf("dc\ts\ndc\ndc\ts!", ...)
模擬實現printf功能輸出如下形式,'d'輸出整形,'c'輸出字符型,'s'輸出字符串,其他輸出自身形式
my_printf("dc\ts\ndc\ndc\ts!",1, 'b',"zhangweina",2, 'i', 3,'t', "welcome to you");
可變參數列表的一些小知識:
//宏 stdard.h
//va_list 聲明一個類型
//va_start 第一個參數為va_list變量的名字,第二個參數為省略號前最後一個有名字的參數。
// 用來初始化變量,即將其設置為指向可變參數部分的第一個參數。
//va_arg 第一個參數為va_list變量的名字,第二個參數為可變參數的類型。
// 調用一次,就指向下一個可變參數。返回值的類型即為第二個參數的類型。
//va_end 訪問完最後一個參數,調用va_end.
#include<stdio.h>
#include<stdlib.h>
#include<stdarg.h>
#include<string.h>
//自定義輸出函數,按照str的字符順序輸出 字符,字符串,數字
void my_printf(const char *str, int len, ...)
{
va_list arg;
va_start(arg, len);
for (int i = 0; i < len; i++,*str++)
{
char a = 0;
char *a1 = NULL;
int a2 = 0;
//多分支語句,分情況討論
switch (*str)
{
case 'c': //參數是字符型,char類型
a = va_arg(arg, char);
putchar(a);
break;
case 's': //參數是字符串時,char*類型
a1 = va_arg(arg,char*);
while (*a1)
{
putchar(*a1);
*a1++;
}
break;
case 'd': //參數是整形,int類型
a2 = va_arg(arg, int);
putchar(a2+'0');
break;
default: //參數是其他,按照本來形式輸出
putchar(*str);
break;
}
}
va_end(arg);
}
int main()
{
char *str = "dc\ts\ndc\ndc\ts!";
int len = strlen(str);
my_printf(str, len,1, 'b',"zhangweina",2, 'i', 3,'t', "welcome to you");
system("pause");
return 0;
}