そして何よりも、C++が足りない
本日、某所で某企業の面接を受けてきました。技術に強い所で有名な企業さんで、当然ホワイトボードにコードを書く問題が出るわけです。
自分に出された課題は、一桁の数値で割り切れる値と、各桁毎のいずれかにその数値が存在する場合のみ、文言を出す関数を作れというもの*1
言語はC++指定です。C++...
そこでわたくし、
やってしまいました
まあ、その時書いたコードを見てくれ。本当にひどいから。
// // 入力値: value = 6, 31, 11. 301 radix = 3 // 6, 31, 301の場合にHogeと出力されること。 // void func(int value, radix) { // ここで割り切れる値の場合を処理 if(value / radix > 0 && value % radix == 0) { puts("Hoge"); return; } // ここから下は、各桁数に値があるか判定してる char* temp, * radix_char; sprintf(temp, "%d", value); int length = strlen(temp); itoa(radix, radix_char, 10); int i; for(i = 0; i < value; i++) { if( *(temp+i) == *radix_char) { puts("Hoge"); return; } } }
はい、真ん中辺りのchar* temp, radix_char;を見てみましょう。
初期化してませんね。
char*を使って文字列を扱う場合、(char*)malloc(sizeof(char) * 256)みたいな感じで、メモリ領域を確保してあげる必要があります。
このコード書いて動かしてみれば分かると思いますが、見事に死にます。
C++書いたのが相当昔で...というのは言い訳でしかなく、本来、開発者として見につけておかなければいけないものです。
それが面接の場で書けなかった。凹みますorz。
さて、今回の問題では、mallocするほど厳密なメモリ管理は必要とされないので、テキトーに領域確保してくれる、char[ ]を使って行うべきです。char[ ]に直して書いてみます。
void func(int value, radix) { if(value / radix > 0 && value % radix == 0) { puts("Hoge"); return; } char temp[256] = {'\0'}, radix_str[2] = {'\0'}; sprintf(temp, "%d", value); int length = strlen(temp); sprintf(radix_str, %d, radix); int i; for(i = 0; i < value; i++) { if( temp[i] == radix_str[0]) { puts("Hoge"); return; } } }
sprintf();を実行しているとこでは、itoa()を使っても動くと思います。ただ、itoa()は非標準で推奨されていませんけども。
私はこんな風に解いたのですが、「もっといい方法あるよ」って方はコメントにて書いて頂けるうれしいです。
*1:問題は、若干変えています