簡易printfをつくる | 遥かなるひよこ道
プログラムは文字なり絵なり、かずきなり出力できないと面白くない。

今回は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 第二版