課題プログラム内の「/*名前:ここ*/」の部分を書き換え「/*この部分を完成させなさい*/」の部分にプログラムを追加して、プログラムを完成させます。
Download : 20151218-01.c ( SJIS 版 )
/* * 20151218-01-QQQQ.c * Point2D 型に対応した myprintf を拡張して作る */ #include <stdio.h> #include "s_print.h" #include "s_input.h" /* * */ typedef struct { int x; int y; } Point2D; /* * 複数の引数を書式指定して文字列の中に埋め込む */ void myprintf ( char *msg, ... ) { int i; char *pvalue = (char *)&msg + sizeof( char * ); Point2D pv; for ( i = 0; msg[i] != EOS; i++ ) { if ( msg[i] == '%' ) { /* 文字列の中に '%' があったら特別処理する */ i++; /* 次の文字をみる */ switch ( msg[i] ) { case 'd': /* 10 進数 */ s_print_int ( *((int *)pvalue) ); pvalue += sizeof ( int ); break; case 'o': /* 8 進数 */ s_print_int ( *((int *)pvalue) ); pvalue += sizeof ( int ); break; case 'x': /* 16 進数 */ s_print_int ( *((int *)pvalue) ); pvalue += sizeof ( int ); break; case 'c': /* 文字 */ s_print_char ( *((char *)pvalue) ); pvalue += sizeof ( int ); /* char は自動的に int にされる */ break; case 's': /* 文字列 */ s_print_string ( *((char **)pvalue) ); pvalue += sizeof ( char * ); break; case 'f': /* 浮動小数点数 */ s_print_double ( *((double *)pvalue) ); pvalue += sizeof ( double ); break; case 'D': /* Point2D 型 */ pv = *((Point2D *)pvalue); /* pv の値を (%d,%d) の形式で出力する */ /* ** この部分を完成させなさい */ /* 次のデータを処理するために pvalue 変更 */ /* ** この部分を完成させなさい */ break; case '%': /* '%' が重なったら.. */ s_print_char ( '%' ); /* '%' を出力 */ break; default: /* その他 : よくわからないので読み飛ばす.. */ break; } } else { /* そうでなけれ .. */ s_print_char ( msg[i] ); /* そのままその文字を出力 */ } } } /* * 色々な数値の出力 */ int main ( void ) { Point2D pv; pv.x = 2; pv.y = -3; /* * データの出力 (Output) */ myprintf ( "整数値(%%d) : %d, 文字(%%c) : '%c', 文字列(%%s) : \"%s\", 浮動小数点数(%%f) : %f, \ 点の座標 (%%D) : %D\n", 123, (int)'a', "xyz" , 1.23, pv ); /* * */ return 0; } /* * */
$ ./20151218-01-QQQQ.exe 整数値(%d) : 123, 文字(%c) : 'a', 文字列(%s) : "xyz", 浮動小数点数(%f) : \ 1.230000, 点の座標 (%D) : (2,-3) $