とあるケイジバンに数値を任意の2〜16進数文字列に変換するプログラムの話題があったので、自分なりの回答を書いておく。関数名がどっかのOSみたいだな(笑)。
char *ntos( int n, int r )
{
static char buf[33];
char *p = &buf[32];
unsigned int a;
/* 変換指定進数のチェック */
if ( r < 2 || r > 16 ) {
return NULL;
}
/* 値が0の時 */
if ( n == 0 ) {
*(--p) = '0';
return p;
}
if ( n < 0 && r == 10 ) {
/* 正の値に */
a = -n;
} else {
a = n;
}
while ( a ) {
*(--p) = "0123456789ABCDEF"[a % r];
a /= r;
}
/* 10進数で負の値の時は符号付加 */
if ( n < 0 && r == 10 ) {
*(--p) = '-';
}
return p;
}
|
gcc 2.95.2ではOKな感じだ。