バグ:文字列のイテレータで指定文字を検索

Posted: 2012年12月31日

文字列のイテレータで指定文字を検索する処理でよく書いてしまうバグを紹介します。
イテレータとは、ポインターのようなものであるがポインターではないため
ポインターのように扱うと問題になります。

プログラムプログラム:

 #include <stdio.h>

 int main(int argc, char *argv[])
 {
    std::string strSrc = _T("1234567890");
    TCHAR cSearchWord = _T('5')

    int nFindIndex = 0;
    string::iterator inIte = strSrc.begin();
    while (inIte != strSrc.end()) {
        if (*inIte == cSearchWord) {
            break;
        }
        nFindIndex++;
    }

    return 0;
 }

このプログラムにどのような文字列のイテレータで指定文字を検索する処理処理のバグがあると思いますか?

  • 実際に見つかったかどうかが不明
  • 検索には、Findを用いることで完結に実装が可能

改善版プログラム改善版プログラム:

 #include <stdio.h>
 #include <string>

 int main(int argc, char *argv[])
 {
    std::string strSrc = _T("1234567890");
    TCHAR cSearchWord = _T('5')

    string::size_type nResultIndex = strSrc.find(cSearchWord, 0);
    if (nResultIndex == string::npos) {
        // 見つからない
        return;
    }

    return 0;
 }

解説解説:

std::stringの実装を見ればFindが存在するため
このような過ちはないと思いますが・・・

今回のプログラムは、「5」を検索しその文字の位置を取得することを望んでいます。
string::size_typeは関係がなさそうですがFindの結果でこの型に文字の位置が設定されます。
この型名を見るとFindじゃないじゃんと思ってしまいますが

イテレータの話題にしたかったのですが
Findについての話題になってしまいましたため
今度こそイテレータの話題を記述していきたいと意気込んでいましたが
文字列に関してのイテレータは考えられそうにないため
しばらくお蔵入りにします。

カテゴリー: バグ, プログラム | タグ: , , | コメント無し »

コメント