• ベストアンサー

C&C++のプログラミングの質問なんですが(2回目)、、、、

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

質問者が選んだベストアンサー

  • ベストアンサー
noname#2009
noname#2009
回答No.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進数まで対応。どうぞお好きに

その他の回答 (4)

  • hogeta
  • ベストアンサー率14% (4/28)
回答No.4

gccにはitoaはなかったようなきがします。 atoiも中途半端だったような。 それはともかく、この質問は「関数を作って」という質問ですよね。 正直いって、むしのよすぎる質問ではないですか? ここは学校の課題の答を教えてもらうところではないと思いますが みなさんどのようにお考えでしょう? 文句ばかりいってもしょうがないので、ポインタを示しておきます。 dをnで割った余りがn進数の1桁になります。 あとは、dをnで割った商に対して同じことを繰り返せば、 2桁、3桁と求まっていきます。 あとは、繰り返すたびに桁の位置をずらすことと、 10以上の数は、アルファベットに変換することを忘れないで。

  • yotta
  • ベストアンサー率32% (26/79)
回答No.3

itoa()でだめな理由が分かりませんが あえて d2q() を創るとすると char str[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); #前回の質問はちゃんと締め切って下さいね

  • taka_tetsu
  • ベストアンサー率65% (1020/1553)
回答No.2

なんでitoa()ではだめなんですか? 格納する領域が無いのにchar*で返して欲しいといっても、だめでしょ。 そのインターフェイスで結果が欲しいのであれば、グローバルな領域に値を格納する領域を準備しておく必要があります。 #前回の質問もほったらかしのようですし。

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

補足

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

  • madman
  • ベストアンサー率24% (612/2465)
回答No.1

10進数であろうと、n進数であろうと、プログラム内のデータとしては同じ値です。 従って、intでn進数として持つことは出来ません。 表示させるだけなら、printfなどを使ってフォーマット変換するだけです。

関連するQ&A