Thinkers'Studio
JavaとC言語の自習ツール
3桁ごとにカンマをはさむプログラム例( C言語版 )

3桁ごとにカンマを入れた文字列を返す関数

 今回は、金額などの表示で使う、3桁ごとにカンマを入れる関数のサンプルです。
 int の値と結果を入れる文字配列を引数で渡すと、3桁ごとにカンマを挟んだ文字列をセットします。
    void insComma( int num, char str[MAXLEN] )

 文字列なら文字数も分かりますが、int の値をもらうので桁数もすぐには分かりません。
 まず、次のような繰り返し処理で、カンマを入れた逆さまの文字列を作ります。 (例 1234567 --> "765,432,1")
  ・ 1 の位からひと桁ずつ取り出し、文字として配列に保存しながら桁数を数える
  ・ 3 桁の区切りで、まだ上の桁があればカンマを入れる
 最後に、文字列をひっくり返し、引数の文字配列にセットして返します。 (例 "765,432,1" --> "1,234,567")

【 3桁ごとにカンマをはさむプログラム例( C言語版 ) 】
#include <stdio.h>
#define MAXLEN 14

void insComma( int num, char str[MAXLEN] )
{
    int i, j, keta, temp;
    int minus = 0;

    /* 下位から順に数字を取り出し3桁の区切りに,を入れる */
    i = keta = 0;
    if( num < 0 ) {
        num = -num;
        minus = 1;
    }
    do {
        str[i++] = num % 10 + '0';  // <-- 今回のクイズ
        keta++;
        num /= 10;
        if( keta % 3 == 0 && num != 0 ) str[i++] = ',';
    } while( num != 0 && i < MAXLEN );
    if( minus ) str[i++] = '-';
    str[i] = '\0';

    /* 逆順にコピーする */
    j = i-1;
    for( i = 0; j > i; i++, j-- ) {
        temp = str[i];
        str[i] = str[j];
        str[j] = temp;
    }
}

main()
{
    char str[MAXLEN];
    insComma( 1234567, str );   printf( "%s\n", str );
    insComma( -1234567, str );  printf( "%s\n", str );
}

(今回のクイズです)
 str[i++] = num % 10 + '0'; の行ですが、なぜ '0' を足しているのか説明できますか?
   (答えは、次回のC言語の Tips で ・・・)

前回のクイズの答え: (前回の問題を見る
    multi_3( &n ); <-- 参照渡し
    multi_5( n );  <-- 値渡し
multi_3 関数は、引数が int へのポインタで宣言されているので参照渡しです。呼び出し側では、変数 n のアドレスを渡すために & をつけます。 multi5 関数の引数は int なので、値渡しです。呼び出し側では、変数名をそのまま渡します。