バグ:ファイルパスからファイル名の抜き出し

Posted: 2013年05月27日

文字列操作(ファイルパスからファいうr名を取得する処理)で書いてしまうバグを紹介します。
今回は、独自の方法であり
他の方法で取得することもできます
一例という事で

プログラムプログラム:

 #include <stdio.h>

 int main(int argc, char *argv[])
 {
    CString strFilePath = _T("C:Temptest.txt");

    int index = strFileName.ReverseFind(_T(""));
    if (index == -1) {
        // 見つからない
        return;
    }
    CString strFileName = strFileName.Mid(index);

    // 処理

    return 0;
 }

このプログラムにどのように文字列操作(書式文字列の取得)にバグが存在すると思いますか?

  • Midの引数がずれているため「\test.txt」が返される

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

 #include <stdio.h>

 int main(int argc, char *argv[])
 {
    CString strFilePath = _T("C:Temptest.txt");

    int index = strFileName.ReverseFind(_T(""));
    if (index == -1) {
        // 見つからない
        return;
    }
    CString strFileName = strFileName.Mid(index + 1);

    // 処理

    return 0;
 }

解説解説:

Find関数では、指定した文字列の位置が取得できます。

この位置は、1文字目が0 2文字目が1となっています。

左側の文字を取得時には、0からのため
strFileName.Left(index)
で正常に動作します。

他の言語の場合は、
substring(0, index)
と等価です。

今回の場合は、右側の文字を取得しているため注意が必要です。
どうしても、左側の取得と同様の方法で書くことがあります。

ちなみに他の言語の場合は、
substring(index + 1);
と等価です。

左側は、文字数
右側は、位置

この違いで
左側は、-1する必要がなくこの問題が
起こりやすくなる原因と思います。

ちなみにこの改善版プログラムには、
他に問題があるため、使用する場合は注意してください。

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

コメント