今回はprintf関数の簡易版を作ってみた。
▼今回出来たもの

%d,%s,\nのみ対応
printfの基本的な動作はシンプルで
void my_print(char *format, ...);
文字列と可変引数
(... この点三つが可変引数ですよということらしい。こいつは必ず最後の引数である必要があるある)
基本は文字を一つずつ出力していって%とかが来たらその都度処理。
引数はstdarg.hのva機能を利用すれば取得できる
void my_print(char *format, ...){
int val_p, div_p = 10;
char c_p, *str_p;
va_list ap;
va_start(ap, format);
while((c_p = *format++) != 0){
if(c_p == '%'){
//変数表示処理
c_p = *format++;
switch(c_p){
case 'd':
//%d相当
if(0 > (val_p = va_arg(ap, int))){
putchar('-');
val_p *= -1;
}
while(val_p / div_p > 0)
div_p *= 10;
while((div_p /= 10) > 0){
putchar(val_p / div_p + '0');
val_p %= div_p;
}
break;
case 's':
//%s相当
str_p = va_arg(ap, char *);
while(*str_p != '\0')
putchar(*str_p++);
break;
default:
//その他
putchar(' ');
break;
}
}else if(c_p == '\\'){
c_p = *format++;
switch(c_p){
case 'n':
putchar('\n');
break;
default:
break;
}
}else{
//通常文字出力
putchar(c_p);
}
}
va_end(ap);
}
int main(void){
char *string = "女子高生大好き";
my_print("a=%s\n%d", string, 200);
return 0;
}
stdarg.hのvaシリーズの使い方
1.va_list型の変数を宣言 K&Rは ap としてたのでならってapで
va_list ap;
2.初期化va_start(ap, format);
この時点で多分可変引数の先頭の情報が入る。formatの部分は可変引数の一個前の引数の名前が入る。
3.va_arg(ap, int)これで引数を使える。intというのはint型で使いますよという意味だと思う。とりあえず型が入る。
4.va_end(ap);
[参考書籍]
プログラミング言語C 第二版