プロが教える店舗&オフィスのセキュリティ対策術

10進整数dをn進数に変換する関数がわかりません。
ただしnが10より大きい場合にも対応でき、
インターフェイスは
char* d2q(int d, int n)
でおねがいします

A 回答 (5件)

ということで、こんな感じ



#include<string.h> // require of memset() strcpy()
#include<stdio.h> // require of sprintf() printf()


#define RETBUFMAX 34// 戻り値バッファサイズ

char* d2q(int d, int n)
{
static char retbuf[RETBUFMAX]; // 戻り値バッファ
char numch[] = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"; // 数字+英数字
char tmp[RETBUFMAX]; //テンポラリバッファ
int res; // 剰余値
int val; // 入力値・商

// 2進数から32進数まで以外はエラー
if(n < 2 || n > sizeof(numch))
return NULL;

val = d;
// バッファクリア
memset(retbuf, 0, sizeof(retbuf));

// 下桁から計算るーぷ
for(;val > 0;) {
res = val % n;
val = val / n;
sprintf(tmp, "%c%s", numch[res], retbuf);
// デバッグ用printf("res=%d val=%d %s\n", res, val, tmp);
strcpy(retbuf, tmp);
}

// 返却
return retbuf;
}

英数字使用で32進数まで対応。どうぞお好きに
    • good
    • 0

gccにはitoaはなかったようなきがします。


atoiも中途半端だったような。

それはともかく、この質問は「関数を作って」という質問ですよね。
正直いって、むしのよすぎる質問ではないですか?
ここは学校の課題の答を教えてもらうところではないと思いますが
みなさんどのようにお考えでしょう?

文句ばかりいってもしょうがないので、ポインタを示しておきます。

dをnで割った余りがn進数の1桁になります。
あとは、dをnで割った商に対して同じことを繰り返せば、
2桁、3桁と求まっていきます。

あとは、繰り返すたびに桁の位置をずらすことと、
10以上の数は、アルファベットに変換することを忘れないで。
    • good
    • 0

itoa()でだめな理由が分かりませんが


あえて d2q() を創るとすると

charstr[100];
char*sss;

char*d2q(int d,int n)
{
return(itoa(d,str,n));
}

または

char*d2q(int d,int n)
{
itoa(d,str,n);
return(str);
}

として
sss=d2q(100,16);
で呼ぶ


次の1行でも全く同じです

sss=itoa(100,str,16);

また sss に値を取らなくても str でも同じです

itoa(100,str,16);

#前回の質問はちゃんと締め切って下さいね
    • good
    • 0

なんでitoa()ではだめなんですか?



格納する領域が無いのにchar*で返して欲しいといっても、だめでしょ。

そのインターフェイスで結果が欲しいのであれば、グローバルな領域に値を格納する領域を準備しておく必要があります。

#前回の質問もほったらかしのようですし。

参考URL:http://www.okweb.ne.jp/kotaeru.php3?q=300399

この回答への補足

戻り値は、変換されたn進数をあらわす文字列としたいんですが・・・・・

補足日時:2002/07/02 13:22
    • good
    • 0

10進数であろうと、n進数であろうと、プログラム内のデータとしては同じ値です。


従って、intでn進数として持つことは出来ません。
表示させるだけなら、printfなどを使ってフォーマット変換するだけです。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!