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