高名なプログラマ Joel Spolsky 氏は、経営する会社の面接試験に於いて、受験者に簡単なコードを書かせるそうです。その一つが「文字列をインプレイスで反転させる」というものです。
氏曰く、ほとんどの受験者が文字列のバッファをもう一つ割り当てて、そこに反転した文字を埋めていくのだそうです。しかし、それでは不合格です。インプレイスじゃないとダメなんです。
と、いうわけで、私も挑戦してみました。
int main () { char str[] = "the quick brown fox jumps over the lazy dog"; int len = strlen( str ); for( int i = 0; i < len/2; i++ ){ str[len] = str[i]; str[i] = str[len-i-1]; str[len-i-1] = str[len]; } str[len] = '\0'; printf( "%s", str ); return 0; }
いかがでしょう。
実行結果は
god yzal eht revo spmuj xof nworb kciuq eht
となります。
とりあえずこれで正解のはずですが、もっとエレガントな書き方を思いつかれた方はぜひご教示ください。
—
印象深いのは、Spolsky 氏が「求めているのは才能に溢れた人物であり、特定のスキルを持った技術者ではない」と述べていることです。日本ではその特定のスキル、殊に資格が重視されるのと好対照ですね。
かつて日本企業のお偉いさん達は口をそろえて「我社の財産は人材です」と言っていたものです(そして、甲陽軍鑑を引用して「人は石垣、人は城!」と得意気に付け加えていたものです)。
それが今では「才能? そんなわけのわからんものより具体的なスキルだ」などとおっしゃる。人材派遣が流行るのも道理です。
その考えも分からないことはありません。即戦力はどこの現場でも欲しい。しかし、それだけではあまりに近視眼的と言わざるを得ません。
十分に賢く、物事を成し遂げるタイプの人を雇えば、どんなスキルであれすぐに身につけてくれる筈です。たまたま今特定のスキルを持っている人よりずっと頼もしいではありませんか。
将来を見据えて人材の採用、育成を行うことが、結局は企業が生き残るための一番の方法です。
パッと見で分からなかったけど、2行目の\0や9行目は意味があるのですか?
あと本題とは違うけど、このソースを見てたら、日本語対応のことを考えて憂鬱になりました(笑)
あ、9行目は必要なんですね。2行目の\0は不要かも?
じゃすさん:
えと、文字列の終端のヌル文字は必須ではないのかもしれないけど、上記のソースでは、文字 a と b を交換(tmp = a; a = b; b = tmp;)する際の tmp の役割をしてます。
あと、4行目で i < len/2 となってるのもミソです。文字数の半分(少数切り捨て)しかループしません。例えば、文字列が"abc"だと、a と c を交換するだけなので1回で済みますもんね。
そうではなく、このコードではヌル文字が2つついていると思うのです。
誤解されているのかもしれませんが、例えば文字列定数は”ABC”と書いた時点で終端にヌル文字がついて4バイト確保されています。
strlen(str)とsizeof(str)を比べてみてください。
じゃすさん:
なるほど!
2行目の’\0’は不要なのですね。上のコメントで書いたとおりヌル文字を tmp として使うという頭があったので、それに引きずられてしまったみたいです。
ご教示ありがとうございます。
私は Spolsky 氏に雇ってもらえそうもありませんね(笑)