プロが教えるわが家の防犯対策術!

c言語で、itoaの関数を使いたいのですが、stdlib.hに設定されてなく、エラーが、'_itoa' value is undefinedと出ます。どうしたら、itoaが使えるようになりますか?]

A 回答 (11件中1~10件)

★『OAKS16MINI』って組み込み系?


・sprintf 関数はありますか?
 この関数もない場合は itoa() 関数を自前で用意することになります。
 下に簡単なサンプルを載せておきます。

サンプル:
char *itoa( int value, char buff[], int radix )
{
 static const char table[] = "0123456789abcdefghijklmnopqrstuvwxyz";
 char *head = buff;
 char *tail = buff;
 char temp;
 
 // マイナス符号を文字列に変換
 if ( value < 0 ){
  *tail++ = '-';
  value = -value;
 }
 // 整数値を文字列に変換
 if ( value == 0 ){
  *tail++ = '0';
 }
 else for ( head = tail ; value != 0 ; value /= radix ){
  *tail++ = table[ value % radix ];
 }
 *tail = '\0';
 // 文字列の左右入れ替え
 for ( tail-- ; head < tail ; head++, tail-- ){
  temp = *head;
  *head = *tail;
  *tail = temp;
 }
 return buff;
}

以上。

この回答への補足

上のサンプルをそのまま使わせていただきましたら
static const char table[] = "0123456789abcdefghijklmnopqrstuvwxyz";
の行で
parse error at near '。'
とエラーがでましたが、どうしたらよいのですか、教えてください。
色々とすみません

補足日時:2007/09/19 08:44
    • good
    • 0
この回答へのお礼

ホンマ、ありがとうございます。
これで、再度チャレンジしてみたいと思います。
文字列の左右入れ替えは、必要なんですよね?

お礼日時:2007/09/19 08:02

> 16進数での入力値をascii変換するプログラムを作ってます。

それには、itoa関数が最適だと考えたのですが、他に何かお勧めってあります?

どうせ1バイトのデータを16進文字列に変換できればよいのでしょう?
itoaを使ってもよいですが、状況次第では必ずしも効率がよいというわけではありませんので、専用の変換関数を作ってしまえばよいのではないでしょうか?
例えば、

char *btoa(char a[2], unsigned char b)
{
 static const char xdigits[] = "0123456789ABCDEF";
 a[0] = xdigits[b >> 4];
 a[1] = xdigits[b & 0xf];
 return a;
}

のような専用関数を作ればよいと思います。
複数バイトを連続して処理するケースが多いと思うので、故意に末尾のナル文字は格納していません。

なお、静的記憶域期間を持つconst属性付きのオブジェクトは、デフォルトでfar領域に配置されます。もしnear領域にROMがあるなら、xdigitsはnearにした方がずっと高速になります。
far領域の場合でも、計算で求めるよりはおそらく表引きの方が高速でしょう。
    • good
    • 0

すでに回答が出ていると思いますが、以前H8/3052用に作った関数を貼っておきます。

(動作実績あり)

/* =============================================================================
itoa
整数を文字に変換する。

引数
(in) value変換元の整数
(out) buff変換後の数値文字列を格納する文字配列のアドレス
戻り値
なし
備考
atoi はCの stdlib.h に含まれているが、itoa は標準では存在しないので
あえて自作した。

===============================================================================
*/
void itoa(int value, char *buff)
{
char *p;
int mod;

// 入力した値の正負を文字にする。
if( 0 > value ) {
*buff++ = '-';
value = -value;
}
p = buff;

// 入力した値を下位の桁から順に文字にする。
do{
mod = value % 10 + 48;
*p++ = (char)mod;
value /= 10;
}while(value);

*p = '\0';// 文字列の最後に '\0' を追加して締める。

strrev(buff);// 文字列の上位の桁から始まるように並べ替える。

}

/* =============================================================================
strrev
文字列を最後から先頭に並べ変える

引数
(in) s変換元の整数
戻り値
並べ替えた文字列
備考
文字列の最後に '\0' が含まれていること。
===============================================================================
*/
char *strrev(char *s)
{
char *ret = s;
char *t = s;
char c;

while( *t != '\0' )
t++;
t--;

while(t > s) {
c = *s;
*s = *t;
*t = c;
s++;
t--;
}

return ret;
}
    • good
    • 0

★最初にマイコンには詳しくはないです。


>16進数での入力値をascii変換するプログラムを作ってます。
>それには、itoa関数が最適だと考えたのですが、他に何かお勧めってあります?
 ↑
 16進数の整数を入力するのですか?
 普通に整数を入力してその入力値を16進文字列に変換したいだけなの?
 ちょっとやりたい事がわからなくなってきました。補足を…。
・ちなみに文字列の左右入れ替えは必要ですね。
 詳しくは回答者 No.8 さんのアドバイスをお読み下さい。
 あと符号なし整数値を16進4桁の文字列に変換したいだけなら次の関数でもOKです。

サンプル:
char *itoh( char buff[], unsigned int hexVal )
{
 static const char table[] = "0123456789abcdef"; ←大文字がよければ書き換え
 int pos = 4; ←16進4桁の『4』
 char *tail = (buff + pos);
 
 for ( *tail-- = '\0' ; pos > 0 ; pos-- ){
  *tail-- = table[ hexVal & 0xF ];
  hexVal >>= 4;
 }
 return buff;
}

解説:
・今度のサンプルでは16進4桁に限定しているため文字列の左右入れ替えは必要ありません。
 処理的にはやはり hexVal の下位の 4ビット(16進数)から順番に文字列に変換しています。
 また剰余や除算を使わずにビットANDとビットシフトを使っています。
 2、4、8、16、32進数などはビット処理した方が少し高速になります。
 上記のサンプルは4桁に限定しているので 0x100 の整数は『0100』という文字列になります。
 16進n桁に改良したい場合は itoh 関数の引数に int pos を記述すれば対応できます。
・あとエラーの件ですがそのままコピー&ペーストすると間違いなくエラーです。
 理由はインデント部を全角空白文字で表現しているからです。
 上記のサンプルでもインデント部は全角空白です。
 よって空白文字をタブ文字か半角空白にエディタなどで一括変換してからコンパイルして下さい。
 時間があったらサンプル関数の処理の手順も考えてみて下さい。なぜこれで整数から文字列に
 変換できるのか。ってね。
・以上。

余談:
>準化委員会が「1つの機能に 1つの関数」という意向を持っていたからだと風の噂で聞いたことがあります
 私も準化委員会が『1つの機能に 1つの関数』という意向を…というのは聞いた事があります。
 このことが itoa に関係するのですか?
 でもそれなら strtoi、strtol があるので atoi もなくなってもいい気がしますね。
 atoi は存在するのはなぜだろう?
    • good
    • 0

#5 の関数では下位桁から順に処理するので, 左右の入れ替えは必要です. そうしないと, 256 を 16進に変換すると (本来 100 になるはずが) 001 になります (確認してみてください). う~, プロセッサが持っているであろう (アセンブリの) swap が使いたい....


ちなみに itoa が標準に入らなかったのは, 標準化委員会が「1つの機能に 1つの関数」という意向を持っていたからだと風の噂で聞いたことがあります (itoa の機能は sprintf に含まれる) >#3.
    • good
    • 0

>static const char table[] = "0123456789abcdefghijklmnopqrstuvwxyz";


の行で
>parse error at near '。'
>とエラーがでましたが、どうしたらよいのですか、教えてください。
>色々とすみません
その前の行が怪しい気がしますが。
エラーの意味は、「'。'の近くで文法上異常でコンパイルできません」と言っています。簡単に言うとコメントじゃない'。'があるので、C言語の文法としてコンパイルできませんってところです。

>16進数での入力値をascii変換するプログラムを作ってます。それには、itoa関数が最適だと考えたのですが、他に何かお勧めってあります?
16進の文字列に変換するためには、sprintfを利用するか(jactaさんが書かれている通り実装しだいですが使用メモリ量が増大します)。
自前で16進の文字列に変換するしかありません。Oh-Orangeさんのコードを使ってください。
私としてはROM68KB/RAM2KBなので、十分ROM容量は足りると思うので自前のitoaを使う分には気にしなくて大丈夫だと思います。

>16進数での入力値
マイコンであれば、入力値は2進数(binary)です。
16進数は表記の問題で、16進数での入力値とは普通言いません。まるで、文字列で16進数を受け取っているかのように聞こえてしまいます。

>処理系は、どう調べたらいいのか、わからないです。
処理系とは、実行する時のOSの種類と使用しているコンパイラの名前です。
ネットで質問するときに、これらの情報を省略して質問するとユーザーの多いVisualC++かGNUのgccだと思われてしまいます。
マイコンの場合は独自な仕様のC言語が多いので、かならずマイコンの名前とコンパイラの名称(1つのマイコンで複数の種類のコンパイラが使える場合があるため)を書いてもらうと的確な答えが返せます。
    • good
    • 0

> OAKS16MINI



M16C用のコンパイラNC30には、確かsprintfがあったとは思いますが、OAKS16MINIのメモリサイズを考えると、sprintfを使うのは現実的ではありませね。
かといって、フルスペックのitoaが必要とも思えませんので、実際に必要な機能だけを実装すればよいと思います。
    • good
    • 0
この回答へのお礼

ありがとうございます
16進数での入力値をascii変換するプログラムを作ってます。それには、itoa関数が最適だと考えたのですが、他に何かお勧めってあります?

お礼日時:2007/09/19 07:57

すでに回答が出ているように、itoaは標準関数ではありません。


処理系がサポートしていないのであれば、itoa関数を自作する以外には使えるようにする方法はありません。
    • good
    • 0

★訂正。


・回答を少し間違いました。
 整数を文字列に変換するには strtol ではなくて sprintf 関数を使って下さい。
・以上。

★Tacosanさんへ。
>ちなみに itoa 自体は「Microsoft の独自関数」というわけではないです.
>K&R の C にあって (だから Unix の C ならほとんどあるはず),
>それを Microsoft が (というのも歴史的におかしいけど) とりこんだんだと思いますよ>#1
情報有り難うございます。
確かに DOS 時代から itoa 関数を良く使っていました。
Unix 系や Microsoft 社の歴史的な事は良く分かりませんが…。
ISO C ではなぜ itoa 関数が無いのでしょうね。
    • good
    • 0

どの処理系を使っていますか?


itoa という関数は ISO C にはないはずなので, 処理系によってはないかもね.
ちなみに itoa 自体は「Microsoft の独自関数」というわけではないです. K&R の C にあって (だから Unix の C ならほとんどあるはず), それを Microsoft が (というのも歴史的におかしいけど) とりこんだんだと思いますよ>#1

この回答への補足

ありがとうございます
処理系は、どう調べたらいいのか、わからないです。
OAKS16MINIを使って、プログラムをやっています。
これだけじゃ、不足ですか?

補足日時:2007/09/18 16:32
    • good
    • 0

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