void insComma( int num, char str[MAXLEN] )
文字列なら文字数も分かりますが、int の値をもらうので桁数もすぐには分かりません。
まず、次のような繰り返し処理で、カンマを入れた逆さまの文字列を作ります。
(例 1234567 --> "765,432,1")
・ 1 の位からひと桁ずつ取り出し、文字として配列に保存しながら桁数を数える
・ 3 桁の区切りで、まだ上の桁があればカンマを入れる
最後に、文字列をひっくり返し、引数の文字配列にセットして返します。
(例 "765,432,1" --> "1,234,567")
#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 なので、値渡しです。呼び出し側では、変数名をそのまま渡します。