Thinkers'Studio
JavaとC言語の自習ツール
文字列をint型に変換する atoi関数の自前処理例
 atoi は、<stdlib.h> に定義されている関数で、引数で渡された文字列を int型に変換して返します。
 形式は次の通りです。
   int atoi( const char *s )   sをintに変換して返す

自前処理の atoi の仕様

 今回は、カーニハン&リッチーの本「プログラミング言語C」から引用した処理例を紹介します。
 次のような仕様です。
  atoiに渡す文字列    atoiの戻り値
    "500.5abc"    -->    500       最初に見つかった連続する数字を整数値として返す
    "    2468"    -->    2468      先頭にある空白は飛ばす
    "-1234"       -->    -1234     -符号で始まっていれば負の値として
    "+1234"       -->    1234      +符号なら、正の値として
    "abc"         -->    0         数字列が見つからなければ0が返る

atoi 関数の自前処理サンプルプログラム 】
#include <stdio.h>
#include <ctype.h>

int atoi( char s[] ) {
    int i, n, sign;

    for( i = 0; isspace( s[i] ); i++ )  //先頭の空白を読み飛ばす
        ;
    sign = ( s[i] == '-' ) ? -1 : 1;    //符号を保存する
    if( s[i] == '-' || s[i] == '+' )    //符号を飛ばす
        i++;
    for( n = 0; isdigit( s[i] ); i++ )  //s[i]が数字のあいだ、nへ
        n = 10 * n + ( s[i] - '0' );
    return sign * n;                    //符号を反映
}

main()
{
    printf( "%d\n", atoi( "500.5abc" ) );
    printf( "%d\n", atoi( "    2468" ) );
    printf( "%d\n", atoi( "-1234" ) );
    printf( "%d\n", atoi( "+1234" ) );
    printf( "%d\n", atoi( "abc" ) );
}

 atoi の中心となる下記の処理について
    n = 10 * n + ( s[i] - '0' );
  • 10 * n で先ほど処理した桁をひとつ上位の位にしています。
  • s[i] - '0' は、1 桁の "数字" s[i] を "数値" にするために、'0' の文字コードを引いています。
    '0' から '9' の文字コードは連続しているので、'0' との差を求めれば 0 から 9 の範囲の数値を得ることができます。
 int型から文字列への変換は
 上のプログラムとは逆の変換は、3桁ごとにカンマをはさむプログラム例 で紹介しています。
 ひと文字ずつ処理する必要がないなら、sprintf を使えばよいですね。 これを下記でクイズとします。

(今回のクイズです)
 たとえば、int型 num の文字列表現を char str[12] に入れるには、sprintf を使ってどのように書けばよいでしょうか?
   (答えは、次回のC言語の Tips で ・・・)

前回のクイズの答え: (前回の問題を見る
3次元配列にするなら、宣言はたとえば、次のようにします。
   int seats[CARS][COLS][SEATS]   //CARS はバスの台数としてdefine
関数の引数宣言も3次元配列とします。
   int notReservedCnt( int seats[CARS][COLS][SEATS] ) または
   int notReservedCnt( int seats[][COLS][SEATS] )
初期化例や関数のコードは、次のリンクから表示できます。 >> 3次元配列にしたプログラム例