WGC1 第2章数値表現 2.3数値と文字列の変換

WGC1 第2章数値表現 2.2記数法の続き

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.

ソースコード形式かバイナリ形式か、変更するかしないかを問わず、以下の条件を満たす場合に限り、再頒布および使用が許可されます。

* ソースコードを再頒布する場合、上記の著作権表示、本条件一覧、および下記免責条項を含めること。

* バイナリ形式で再頒布する場合、頒布物に付属のドキュメント等の資料に、上記の著作権表示、本条件一覧、および下記免責条項を含めること。

* 書面による特別の許可なしに、本ソフトウェアから派生した製品の宣伝または販売促進に、<組織>の名前またはコントリビューターの名前を使用してはならない。


本ソフトウェアは、著作権者およびコントリビューターによって「現状のまま」提供されており、
明示黙示を問わず、商業的な使用可能性、および特定の目的に対する適合性に関する暗黙の保証も含め、
またそれに限定されない、いかなる保証もありません。著作権者もコントリビューターも、
事由のいかんを問わず、 損害発生の原因いかんを問わず、かつ責任の根拠が契約であるか
厳格責任であるか(過失その他の)不法行為であるかを問わず、仮にそのような損害が発生する
可能性を知らされていたとしても、本ソフトウェアの使用によって発生した(代替品または代用
サービスの調達、使用の喪失、データの喪失、利益の喪失、業務の中断も含め、またそれに限定
されない)直接損害、間接損害、偶発的な損害、特別損害、懲罰的損害、または結果損害について、
一切責任を負わないものとします。










Randall Hyde、鵜飼 文敏、まつもと ゆきひろ、後藤 正徳、トップスタジオ