strlen関数をループ文を使用しないで実現する
いま、『ソフトウェア開発の名著を読む (技評SE新書 003)』という本を読んでいるが、その中に次のような一節がある。
応募者の実力については、面接時に実践的な技術的質問をすることで、ある程度評価することが可能ではないかと思います。
私自身もある面接で、「strlen関数を、ループ文を使用しないで実現してください」「C++のvirtualの意味を説明してください」と聞かれたことがあります。前者は10分程度考えれば答えが出てきてほしい質問であり、後者は「C++でプログラミング経験があります」という人が、どのような態度で言語を使用しているかを知ることができる質問です。
(P.64, 65)
後者の質問については、僕はC++のプログラミング経験も知識もほとんど無いので分かりません、と答えるしかない。
しかし、前者の質問については、僕はC言語でのプログラミング経験はあるので、「strlen関数をループ文を使用しないで実現する方法」を考えてみた。
考えて、考えて、実際にプログラムを作成してみた結果、構想20分+制作40分のトータル約1時間かかってやっと実現できた。
さあ、Cプログラマのあなたは何分で実現できますか?
つづきはウェブで!
- 作者: 柴田芳樹
- 出版社/メーカー: 技術評論社
- 発売日: 2006/07/26
- メディア: 新書
- 購入: 3人 クリック: 21回
- この商品を含むブログ (60件) を見る
僕の実現方法はこうです。
ループ文を使用しないということで、最初はメモリ上に展開された文字コードの並びがうんぬんかんぬん・・と考えていたのですが、文字列を木構造ととらえた瞬間に再帰呼び出しを使えばいいんじゃないかということに気付きました(ここまでが20分..)。
あとは実際にプログラムを作ってみると、文字列の数のカウントがなかなかうまくいかず手こずりました(40分..)。
まあ関数名とかあれですが、もし「いやそうじゃなくてこういう方法のほうが良いんじゃないの?」とかありましたら、教えていただけると嬉しいです。
・ループ文を使用しないでstrlenを実現する strleeen 関数のプログラム。
#include <stdio.h> int strleeen(char *buf) { int cnt = 0; if(*buf != 0){ cnt = 1 + strleeen(++buf); } return cnt; } int main(void) { int len, len2; char buf[64]; memset(buf, 0, sizeof(buf)); strcpy(buf, "test20070301"); len = strlen(buf); len2 = strleeen(buf); printf("%s\n", buf); printf("len = %d\n", len); printf("len2= %d\n", len2); return 0; }
・実行結果。
$ ./test.exe test20070301 len = 12 len2= 12