- ベストアンサー
itoaわかりません
c言語で、itoaの関数を使いたいのですが、stdlib.hに設定されてなく、エラーが、'_itoa' value is undefinedと出ます。どうしたら、itoaが使えるようになりますか?]
- minidora25
- お礼率18% (2/11)
- C・C++・C#
- 回答数11
- ありがとう数10
- みんなの回答 (11)
- 専門家の回答
質問者が選んだベストアンサー
★『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; } 以上。
その他の回答 (10)
- jacta
- ベストアンサー率26% (845/3158)
> 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領域の場合でも、計算で求めるよりはおそらく表引きの方が高速でしょう。
- Interest
- ベストアンサー率31% (207/659)
すでに回答が出ていると思いますが、以前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; }
- Oh-Orange
- ベストアンサー率63% (854/1345)
★最初にマイコンには詳しくはないです。 >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 は存在するのはなぜだろう?
- Tacosan
- ベストアンサー率23% (3656/15482)
#5 の関数では下位桁から順に処理するので, 左右の入れ替えは必要です. そうしないと, 256 を 16進に変換すると (本来 100 になるはずが) 001 になります (確認してみてください). う~, プロセッサが持っているであろう (アセンブリの) swap が使いたい.... ちなみに itoa が標準に入らなかったのは, 標準化委員会が「1つの機能に 1つの関数」という意向を持っていたからだと風の噂で聞いたことがあります (itoa の機能は sprintf に含まれる) >#3.
- zwi
- ベストアンサー率56% (730/1282)
>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つのマイコンで複数の種類のコンパイラが使える場合があるため)を書いてもらうと的確な答えが返せます。
- jacta
- ベストアンサー率26% (845/3158)
> OAKS16MINI M16C用のコンパイラNC30には、確かsprintfがあったとは思いますが、OAKS16MINIのメモリサイズを考えると、sprintfを使うのは現実的ではありませね。 かといって、フルスペックのitoaが必要とも思えませんので、実際に必要な機能だけを実装すればよいと思います。
お礼
ありがとうございます 16進数での入力値をascii変換するプログラムを作ってます。それには、itoa関数が最適だと考えたのですが、他に何かお勧めってあります?
- jacta
- ベストアンサー率26% (845/3158)
すでに回答が出ているように、itoaは標準関数ではありません。 処理系がサポートしていないのであれば、itoa関数を自作する以外には使えるようにする方法はありません。
- Oh-Orange
- ベストアンサー率63% (854/1345)
★訂正。 ・回答を少し間違いました。 整数を文字列に変換するには strtol ではなくて sprintf 関数を使って下さい。 ・以上。 ★Tacosanさんへ。 >ちなみに itoa 自体は「Microsoft の独自関数」というわけではないです. >K&R の C にあって (だから Unix の C ならほとんどあるはず), >それを Microsoft が (というのも歴史的におかしいけど) とりこんだんだと思いますよ>#1 情報有り難うございます。 確かに DOS 時代から itoa 関数を良く使っていました。 Unix 系や Microsoft 社の歴史的な事は良く分かりませんが…。 ISO C ではなぜ itoa 関数が無いのでしょうね。
- Tacosan
- ベストアンサー率23% (3656/15482)
どの処理系を使っていますか? itoa という関数は ISO C にはないはずなので, 処理系によってはないかもね. ちなみに itoa 自体は「Microsoft の独自関数」というわけではないです. K&R の C にあって (だから Unix の C ならほとんどあるはず), それを Microsoft が (というのも歴史的におかしいけど) とりこんだんだと思いますよ>#1
補足
ありがとうございます 処理系は、どう調べたらいいのか、わからないです。 OAKS16MINIを使って、プログラムをやっています。 これだけじゃ、不足ですか?
- Oh-Orange
- ベストアンサー率63% (854/1345)
★アドバイス ・『itoa』関数は VC++ のコンパイラしか使えなかった気がします。 つまりマイクロソフト社の独自関数かな。 だからあまり使わない方がいい。 『itoa』の代わりに『strtol』関数を使って下さい。 または『sprintf』関数を使って下さい。 ・以上。
関連するQ&A
- VC2005で数値を文字列に変換
数値を文字列に変換しようとしているのですがうまくいきません。 _itoa(),sprintf()を試したのですが何れもうまくいきません。 _itoa()の場合は, #include <stdlib.h> #include <stdio.h> CString k; int answer = 2; _itoa(answer,k); のようにすると error C2660: '_itoa' : 関数に 2 個の引数を指定できません。 というようなことが表示されます。 sprintf()の場合は、 #include <stdio.h> char* k; int answer = 2; sprintf(k,"%d",answer); のようにするとコンパイルは出来るのですが計算をし始めると、 Run-Time Check Failure #3 - The variable 'k' is being used without being defined. というメッセージボックスが表示されます。 誰か助けてください。
- ベストアンサー
- C・C++・C#
- 絶対パスの取得について
C言語の絶対パスの取得方法をどのようにするかで迷っています。 「stdlib.h」の「_fullpath」という関数を見つけたのですが、ほかにいい関数はないでしょうか?
- 締切済み
- C・C++・C#
- C言語Char型配列に小数値を入れる方法
C言語Char型配列に小数値を入れる方法について質問なんですが、 分からなく質問させていただきました。 (例)23.8を float f = 23.8 char c[100]; cの配列の中に23.8を入れる c[0] = '2' c[1] = '3' c[2] = '.' c[4] = '8' c[5] = '\0' 上記みたいに入ってほしいんですが、そういうC言語の関数ありますか? itoaやsprintfを使わないでお願いします。
- ベストアンサー
- C・C++・C#
- cygwin gcc c99 での isnormal と strtold の使用
Cygwinのgccで-std=c99オプションを付けて 以下のコードをコンパイルしようとしています。 #include <stdlib.h> #include <math.h> int main() { isnormal(0.123); strtold("0.123", NULL); return 0 ; } $> gcc -std=c99 test_strtold.c ですが、コンパイルできず、2つの関数とも'undefined reference'になります。 -std=c99を付けてコンパイルする方法または この記述と同等の別の記述がありましたらご教授願います。 よろしくお願いいたします。
- 締切済み
- C・C++・C#
- 多次元配列をエンコードする関数を作るには?
多次元配列でも文字コードのエンコードができる関数を 作ろうとしていますが、エラーで躓いています。 自分自身の関数を再帰で呼び出しているので、array_map関数上? 引数が1つしか持てないので、$valueを array($ary, "SJIS", "EUC-JP")として渡しています。 これを実行すると、以下のエラーになります。 何かよい方法はありますか? PHP Notice: Undefined offset: 0 in C:\test.php on line 10 function mb_convert_encoding_deep($value) { //var_dump($value); if( is_array($value) ){ if( is_array($value[0]) ){ array_map(__FUNCTION__, $value); }else{ $value[0] = mb_convert($value[0], $value[1], $value[2]); } }else{ die("ここは通過しないと思いますが自信なし"); } return $value; } $ary = mb_convert_encoding_deep( array($ary, "SJIS", "EUC-JP") ); array_mapの用法でも間違っているのでしょうか?
- ベストアンサー
- PHP
- おしえて
C言語のソースのおかしいところ教えてください。 #include <stdio.h> #include <time.h> #include <stdlib.h> main () { int computer; srand(time(NULL)); printf("【ジャンケンゲ―ム】\n"); computer = rand()%3+1; printf("コンピュータは"); if(computer ==1) { printf("グー"); } else if(computer == 2) { printf("チョキ"); } else {printf("パー"); } printf("! "); return 0; } エラーは エラー E2206 2-3.c 12: 不正な文字 ' ' (0x8140)(関数 main ) エラー E2206 2-3.c 12: 不正な文字 ' ' (0x8140)(関数 main ) とでます。
- ベストアンサー
- C・C++・C#
- intをcharに変換
例えば,int型の数値をchar[]に変換したいと思っています. Windowsではstdlib.hをインクルードすると itoa()という関数が使えますが, Linuxでは使えず,itoaと同等のものを自分で作る必要があるようです. intは常に-10~-99の間なのでこんな風に書いてみたんですが, 出力してみると文字化けしててダメでした. void itoa2(int i,char *str){ str[0] = ' '; str[1] = '-'; str[2] = (-1*i)/10; str[3] = (-1*i)%10; } よい方法をご存知の方いらっしゃいませんでしょうか. Red Hat Enterprise Linux Client release 5.3 (Tikanga) gcc バージョン 4.1.2 20080704 (Red Hat 4.1.2-44) を使っています.
- ベストアンサー
- C・C++・C#
- メモリ確保の謎。
C言語のメモリの確保の所でふと疑問に思ったのですが、 malloc,calloc,realloc,memset,memcpyなどの関数を使うときって #include <stdio.h> #include <stdlib.h> #include <memory.h> #include <malloc.h> とか書かないといけないと本にはありますが、#include <stdio.h>だけで なんのエラーにもならずに実行できてしまうのはなぜでしょうか? 実際のプログラムにはmallocとreallocしか使ってないのですが、#include <stdio.h>でできてしまいます。 でも教科書には他にも書かなきゃいけないとかいてありますが、なぜ書かなくても実行できてしまうのでしょうか?
- ベストアンサー
- C・C++・C#
- math.hに含まれる関数が使えない
math.hヘッダーをインクルードして、sqrt()やcos()の関数を使おうとすると、関数sqrt()は定義されていませんとエラーが出て正常にコンパイルできません。 他のヘッダー(stdio.hやstring.hやstdlib.h)の関数は正常に使えてますので、パスの設定は問題ないと思うのですが…… 解決方法はあるのでしょうか?宜しくお願いします。
- ベストアンサー
- C・C++・C#
- C言語コンパイラーエラーについて教えてください。
C言語でコンパイルができなくて困っています。 コンパイルをすると、 ----------------------------------------- test.c.20:undefined reference to `getcury' test.c:20: undefined reference to `getcurx' collect2: ld returned 1 exit status ----------------------------------------- と言うエラーが出てしまい、コンパイルが完了しません。 ソースは、「test.c」と言うファイルネームで、内容は ----------------------------------------- #include <stdio.h> #include <stdlib.h> #include <curses.h> int main (void) { int y = 0, x = 0; initscr(); getyx(curscr, y, x); printw("x = %d, y = %d", x, y); refresh(); getchar(); endwin(); return 0; } ----------------------------------------- です。 OSは、Windows7 Professional SP1 コンパイラーは、MinGW Ver5.1.6. で、コマンドは gcc -o test.exe test.c -lcurses です。 確かに、curses へはパスも通っており、リンクできているようなんですが、 エラーが出てしまいます。 どうすれば良いのかわからず、大変困っています。 だれかご存知の方、教えてください。 どうかよろしくお願い致します。
- 締切済み
- C・C++・C#
お礼
ホンマ、ありがとうございます。 これで、再度チャレンジしてみたいと思います。 文字列の左右入れ替えは、必要なんですよね?
補足
上のサンプルをそのまま使わせていただきましたら static const char table[] = "0123456789abcdefghijklmnopqrstuvwxyz"; の行で parse error at near '。' とエラーがでましたが、どうしたらよいのですか、教えてください。 色々とすみません