課題プログラム内の「/*名前:ここ*/」の部分を書き換え「/*この部分を完成させなさい*/」の部分にプログラムを追加して、プログラムを完成させます。
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)
$