WGC1 第2章数値表現 2.3数値と文字列の変換
10進数の文字列を整数値に変換するアルゴリズムは書いてある。
2進数にするアルゴリズムを書いたほうが面白かったかもしれない。
10進数を指定のn進数の文字列に変換するitoa()は、非標準のCライブラリ関数なので
使えないところもあるから。
Visual C++ | gcc | |
---|---|---|
0bリテラル | × | ◯ (4.4.0以降) |
itoa() | ◯ | × |
ソース
#include <stdlib.h> int main(int argc, char *argv[]){ char binary[64]={0}; int test[4]={1,3,5,8}; int i=0; for(i=0; i < sizeof(test)/sizeof(test[0]); i++) { printf( "%d of Binary Numbering is %s\n", test[i],itoa(test[i],binary,2)); } return 0; }
コンパイル
D:\workspace\C_SandBox\10BOOKs\WGC1\2.3_Numeric-String_Conversions>cl itoa_sa mple.c Microsoft(R) 32-bit C/C++ Optimizing Compiler Version 15.00.21022.08 for 80x86 Copyright (C) Microsoft Corporation. All rights reserved. itoa_sample.c Microsoft (R) Incremental Linker Version 9.00.21022.08 Copyright (C) Microsoft Corporation. All rights reserved. /out:itoa_sample.exe itoa_sample.obj
実行
D:\workspace\C_SandBox\10BOOKs\WGC1\2.3_Numeric-String_Conversions>itoa_sample.exe 1 of Binary Numbering is 1 3 of Binary Numbering is 11 5 of Binary Numbering is 101 8 of Binary Numbering is 1000
gcc 4.4.0
itoaがないのでリンクエラーになる。
gcc44 itoa_sample.c -o itoa_sample itoa_sample.c: In function ‘main’: itoa_sample.c:8: 警告: incompatible implicit declaration of built-in function ‘printf’ /tmp/ccq01IV4.o: In function `main': itoa_sample.c:(.text+0x6d): undefined reference to `itoa' collect2: ld はステータス 1 で終了しました
tools.cのitoa(),utoa()を使うと以下のようになる。*1
ソース
#include <stdlib.h> char* utoa(unsigned val, char *buf, int radix){ char *p = NULL; char *s = "0123456789abcdefghijklmnopqrstuvwxyz"; if(radix == 0) { radix = 10; } if(buf == NULL) { return NULL; } if(val < (unsigned)radix) { buf[0] = s[val]; buf[1] = '\0'; } else { for(p = utoa(val / ((unsigned)radix), buf, radix); *p; p++); utoa(val % ((unsigned)radix), p, radix); } return buf; } char* itoa(int val, char *buf, int radix) { char *p; unsigned u; p = buf; if(radix == 0) { radix = 10; } if(buf == NULL) { return NULL; } if(val < 0) { *p++ = '-'; u = -val; } else { u = val; } utoa(u, p, radix); return buf; } int main(int argc, char *argv[]){ char binary[64]={'\0'}; int test[4]={1,3,5,8}; int i=0; for(i=0; i < sizeof(test)/sizeof(test[0]); i++) { printf( "%d of Binary Numbering is %s\n", test[i],itoa(test[i],binary,2)); } }
実行結果
[oc@centos5 2.3_Numeric-String_Conversions]$ itoa_sample 1 of Binary Numbering is 1 3 of Binary Numbering is 11 5 of Binary Numbering is 101 8 of Binary Numbering is 1000
Googleコード検索で、「itoa」、「"0123456789abcdefghijklmnopqrstuvwxyz"」で探せば
いろいろな実装方法がでてくるな。
*1
修正BSDライセンス
Copyright (c) 2011, watterott
All rights reserved.ソースコード形式かバイナリ形式か、変更するかしないかを問わず、以下の条件を満たす場合に限り、再頒布および使用が許可されます。
* ソースコードを再頒布する場合、上記の著作権表示、本条件一覧、および下記免責条項を含めること。
* バイナリ形式で再頒布する場合、頒布物に付属のドキュメント等の資料に、上記の著作権表示、本条件一覧、および下記免責条項を含めること。
* 書面による特別の許可なしに、本ソフトウェアから派生した製品の宣伝または販売促進に、<組織>の名前またはコントリビューターの名前を使用してはならない。
本ソフトウェアは、著作権者およびコントリビューターによって「現状のまま」提供されており、
明示黙示を問わず、商業的な使用可能性、および特定の目的に対する適合性に関する暗黙の保証も含め、
またそれに限定されない、いかなる保証もありません。著作権者もコントリビューターも、
事由のいかんを問わず、 損害発生の原因いかんを問わず、かつ責任の根拠が契約であるか
厳格責任であるか(過失その他の)不法行為であるかを問わず、仮にそのような損害が発生する
可能性を知らされていたとしても、本ソフトウェアの使用によって発生した(代替品または代用
サービスの調達、使用の喪失、データの喪失、利益の喪失、業務の中断も含め、またそれに限定
されない)直接損害、間接損害、偶発的な損害、特別損害、懲罰的損害、または結果損害について、
一切責任を負わないものとします。