今回のバグは、「sizeof関数で配列のサイズを取得している」です。
本問題は、変数str1に代入した文字列の文字数を、sizeof関数から取得し、表示しています。A君のミスは、sizeofは、配列のサイズを取得する関数であり、文字数を取得する関数ではないと気づいていないことです。
修正方法は、sizeofの部分をstrlen関数に置き換えると、ヌル文字の1つ手前までの数を取得できます※3)。よって、A君はsizeofとstrlenを勘違いして使用している可能性があります。
読者の方から見れば、「そんなの当たり前」と思われたはずです。A君から見ると、文字数取得ならsizeofと頭に刷り込まれてしまっている可能性があります。問題の複雑さは異なるでしょうが、後々気付くと恥ずかしくなるようなミスでも、煮詰まると分からなくなることが度々あります。特に、「思い込み」は、難解なバグにつながります。
※3)strlenは、文字列の長さを取得する標準関数です。#include<string.h>でインクルードすると使用できます
今回の自己採点シートを以下に示します。
問題 | 内容 | 配点(点) |
---|---|---|
文字数表示プログラム | 問題文を一通り読んだ | 50 |
sizeofとstrlenを取り違えていることが原因だと推察できた | 50 | |
リスト3 自己採点シート |
プログラミングは、非常に創造的で楽しい作業ですが、想定通りにいかない時は非常に苦しい時間です。特に、思い込みがあったり、煮詰まったりすると視野が狭まり、当たり前のことが見えなくなります。
今回は、文字数表示プログラムを題材としました。皆さんならば、今回のような話で困ることはないでしょうが、「煮詰まった」と自覚した時は誰かと相談し、「第三者の目」で見てもらって、早めに問題を解決しましょう。
東海大学 大学院 組込み技術研究科 非常勤講師(工学博士)
Copyright © ITmedia, Inc. All Rights Reserved.