
(答案提出)C言語教室 第5回 - 文字と文字列
私は最近、kznさんの記事に夢中!
懇切丁寧なご説明で、「あーそうだった、そうだった」と、私の錆び付いた脳味噌が反応し始めるのがわかります。
課題
・文字列”abc”の長さを数えて表示する(長さにヌル文字は含めない)。
・文字列”abc”の中で’c’が何番目にあるか探して表示する(最初の文字であれば1)。
私の答案
これまでに説明済みのコマンドのみを使って機能を実現するように、頑張ってみました。(strlen文を使ってはダメということですよね?)
/* main.c */
/*************************************************
改訂履歴
v1.0 22-Nov-2022
v1.1 23-Nov-2022 len関数のFOR条件式を変更
v1.2 25-Nov-2022 kznさんのご指摘に基づいてバグ修正
*************************************************/
#include <stdio.h>
int len(char* x) {
int i;
for (i = 0; x[i] != '\0'; i++) {}
return i;
}
int srcCh(char* x , char y, int z) {
int i, j = 0;
for (i = 0; i < z; i++) {
// 文字列の最終桁に達したら(検索対象文字が見つからなかったら、0を返す)
if (x[i] == '\0') {
j = 0;
break;
}
// 検索対象文字が見つかったら、配列要素番号+1を返す)
if (x[i] == y) {
j = i + 1;
break;
}
}
return j;
}
void main() {
int ln, cp;
char c[] = "abc"; //検索対象文字列
char d = 'c'; //検索文字
ln = len(c); //検索文字列の長さ
cp = srcCh(c, d, ln); //検索文字の出現桁数
printf("\"%s\" 、、、文字列の長さは%d\n", c, ln);
printf("\"%s\" 、、、\'%c\'は、%d文字目\n", c, d, cp);
}
コメント
この課題には、いろいろと罠が仕掛けられているように感じました。
これまでのご説明で、配列自体では配列のサイズを判断できないので、配列を関数に渡す場合は大きさを与えてやる必要がある、、、ということだったと理解したのですが、今回のお題は、文字配列のサイズを返す関数を作りなさいという事です。うーん。
文字配列の最後は必ずヌル文字ですので、文字配列の中でヌル文字が何番目にあるかを、FOR文を使って繰り返し探せば良いのですね。繰り返し条件の設定をどうするか、考えなければなりません。ふむふむ。
len関数は、必ず文字配列が渡されることを前提としたコードです。誤ってNull文字を含まない配列が渡された場合には、結果は保証できません。(上限の設定方法について、後ほどご指導があるかもしれませんね。)
文字列の中から、特定の文字を検索するsrcCh関数ですが、c[0]で見つかった場合は1を返しなさいという指示です。配列の番号をそのまま返すと0となってしまいます。見つからなかった場合にのみ、0を返す事にします。
実行結果
"abc" 、、、文字列の長さは3
"abc" 、、、'c'は、3文字目
どうでしょうか?
一応は、機能しているようです。
(動作環境;https://9cguide.appspot.com/web_picoc_em.html )
次回更新での答え合わせが楽しみです!
後記
プログラムのコーディングって、文章の作文と通じるものがあると思うんです。何かの目的を達成するために表現したいことがあって、そしてその表現方法はいくらでもある。その表現方法ひとつで、作者の思想思考や、ベースにある経験や知識が垣間見える。
プログラミング言語でも同じこと。
同じプログラミング言語を使っていても、特定の機能を実現するだけなら、いくつもの異なるコーディングができると言っていい。
でも、よく考えられたコーディングは、例外的な事象にも対応できるような堅牢さがある。また、判読しやすくて、修正も容易である。
私がkznさんの記事がとても面白く感じるのは、単なるプログラミング言語の文法の説明を超えた、しっかりしたご経験に基づく、深淵な思考がひしひしと伝わってくるから。プログラムコードに、なんとも言えない美しさがある。
私の考える美しいプログラムコードとは、メンテナンスするときに判読しやすいことであり、其の為には、
簡潔な表現
標準的で、再利用や拡張が容易な表現
特定の環境に依存しない、標準的なコマンドを使った表現
無駄のない制御
なんじゃないかなと思っています。
私のプログラムコードは、、、
呂律が回らなくなった、酔っ払いの戯言のような感じだと思います。
、、、そのうち流暢になるかもしれませんが、いつになることやら(笑
*この記事は、私こと、Akio van der Meerが、kznさんの記事にインスパイアされて、私の責任の下で作成したものです。
追記(2022.11.25)
なんと、kznさんからレスをいただきました。
そして、致命的なバグを指摘されてしまいました(涙
上記のコードは、ご指摘を元に修正済みです。
kznさん、ご指導有難うございました。
ここまで読んでいただいて、有難うございました。
いいなと思ったら応援しよう!
