読者です 読者をやめる 読者になる 読者になる

無気力生活 (ノ ´ω`)ノ ~゜

脱力系エンジニア。てきとーに生きてます。

そして何よりも、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:問題は、若干変えています