【c言語】シミュレーション実装printf、要求機能:my_printf(「dctsndcndcndcts!」,...)


シミュレーション実装printf機能出力は以下の形式,'d'出力整形,'c'出力文字型,'s'出力文字列,その他の出力自体の形式である.
 my_printf("dc\tsdcdc\ts!",1, 'b',"zhangweina",2, 'i', 3,'t', "welcome to you");
可変パラメータリストのいくつかの小さな知識:
//宏stdard.h
//va_リスト宣言タイプ
//va_startの最初のパラメータはva_ですlist変数の名前、2番目のパラメータは省略記号の前の最後の名前のあるパラメータです.
//変数を初期化し、可変パラメータ部分を指す最初のパラメータに設定します.
//va_argの最初のパラメータはva_ですlist変数の名前で、2番目のパラメータは可変パラメータのタイプです.
//一度呼び出すと、次の可変パラメータを指します.戻り値のタイプは、2番目のパラメータのタイプです.
//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
dc
dc\ts!"; int len = strlen(str); my_printf(str, len,1, 'b',"zhangweina",2, 'i', 3,'t', "welcome to you"); system("pause"); return 0; }