可変個引数を使った関数で文字の長さを知りたい
可変個引数を使った引数を使って引数の文字列の長さを知りたいのですがどうすればいいのかわかりません。
DXライブラリを使って文字列の長さを測って文字をどこにおくのかを決めているため文字列の長さがわからないと困ってしまいます。
どのようにすれば可変個引数を使った引数の文字列の長さを測れますか?
大体以下のような感じで作っています。
void kai( int *x , int *y ); //文字列を改行する関数
int JC( unsigned char code ); //文字が1バイト文字 か 2バイト文字か判別する
void mozi_show2( int x , int y , int xm , int yb , int color , int char_set , const char *s , ... ){
int i = 0;
int xs = 0 , ys = 0;
int m_color = color;
char One[ 2 ]; //1バイト文字格納用
char Two[ 3 ]; //2バイト文字格納用
const char* p;
va_list args;
va_start( args , s );
p = s;
while( *p != '\0' ){
switch( *p ){
case '%':
p++;
assert( *p != '\0' );
switch( *p ){
case 'd':
DrawFormatStringToHandle( x + xs , y + ys * yb , m_color , char_set , "%d" , va_arg( args , int ) );
//purintfと使い方はほぼ同じで左から文字を表示したいX座標・文字を表示したいY座標
//文字の色・文字の書式・格納用文字列・表示したいint型の数値をあらわしています
xs += 16;
/*
xs += GetDrawFormatStringWidthToHandle( char_set , "%d" , va_arg( args , int ) );
本来ならこの関数を使って文字列の長さを計る左から
文字列の書式・格納用文字列・長さを測りたいint型文字列
これを使うと別のものを計っているみたいで文字の長さがわからない
文字の長さってどうやって計るの?
*/
break;
case 'f':
DrawFormatStringToHandle( x + xs , y + ys * yb , m_color , char_set , "%f" , va_arg( args , double ) );
break;
case 'c':
DrawFormatStringToHandle( x + xs , y + ys * yb , m_color , char_set , "%c" , va_arg( args , char ) );
break;
case 's':
DrawFormatStringToHandle( x + xs , y + ys * yb , m_color , char_set , "%s" , va_arg( args , const char* ) );
break;
case '%':
DrawFormatStringToHandle( x + xs , y + ys * yb , m_color , char_set , "%%" );
xs += GetDrawStringWidthToHandle( "%" , 1 , char_set );
break;
}
p++;
break;
default:
if( JC( *p ) ){
Two[ 0 ] = *p;
Two[ 1 ] = *( p + 1 );
Two[ 2 ] = '\0';
DrawStringToHandle( x + xs , y + ys * yb , Two , m_color , char_set );
xs += GetDrawStringWidthToHandle( Two , 2 , char_set );
p += 2;
}
else{
One[ 0 ] = *p;
One[ 1 ] = '\0';
DrawStringToHandle( x + xs , y + ys * yb , One , m_color , char_set );
xs += GetDrawStringWidthToHandle( One , 1 , char_set );
p++;
}
break;
}
if( xs > xm ){
kai( &xs , &ys );
}
}
va_end( args );
}
void zitu_draw( void ){
char *str = "%d個 OK";
int i = 12;
mozi_show2( 100 , 100 , 300 , 15 , red_s , MG_14_0 , str , i );
//左から 文字を表示するX座標・文字を表示するY座標・文字を改行する文字列の長さ
//改行した時のY座標の縦幅・文字色・文字の書式・表示したい文字列・%dに表示したいint型の値
}
お礼
早速のご回答ありがとうございます。 x2,y2を作るんですね、やってみます。 またよろしくお願いします。