- ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:効率的な拡張子チェック関数を考えています)
効率的な拡張子チェック関数を考えています
このQ&Aのポイント
- 効率的な拡張子チェック関数の作成について相談です。
- 現在試作中の関数を紹介します。
- いくつかの質問があります。
- みんなの回答 (1)
- 専門家の回答
質問者が選んだベストアンサー
回答が付いてないようなので・・・ >1.今のところ例外を見つけていませんが >このfn+i+1は、この用途で、アルファベットの拡張子しか扱わないとしたら必ず >PathFindExtension(fn)+1 >のかわりになりますでしょうか? その用途なら代わりになるでしょう。Unicodeであれば、拡張子が全角文字でも代わりになるかと思います。 >2.Unicodeでもこのままで出来てしまっているのですが、文字定数も_T('.')などとマクロで囲わないと保証はされないのでしょうか? 文字定数に全角文字を使用しない場合は_Tマクロは不要です。全角文字を使用する場合は、_Tマクロを使用しない場合はシフトJISコードでの値になります。 >3.「拡張子を自分でコード内に指定する」「パスが正常に渡されることが保証されてて、その文字数が拡張子の文字数より必ず多い」ならwhile文をなくして、ピリオドが来るべき位置を数字で打ってしまっても問題ないですよね? その条件であれば決め打ちで問題ないかと思います。実際にはなかなか実現するのが難しいと思いますが・・・ >4.またその他どこかになんらかの危険性がある可能性はあるでしょうか? 引数fn文字列の中にピリオド'.'が1つも無い場合(いわゆる拡張子なしのパス)に変数iがマイナスになり、アクセス違反が起こる可能性があると思います。
お礼
ありがとうございます♪ 予想通りといった感じでとても安心できました。 >3について この関数内で完結するようにするためには、たとえば簡単なところで、拡張子の長さを先にもう一つの引数として渡してしまう、という作戦もあります。 あとは関数の先頭で、ファイルパス文字列のポインタがNULLじゃないか、また長さがそれより短くないかどうかをチェックすれば、While文を消すことが可能だと思います。 ただ、実際には関数を呼んだり戻り値を生成するのにもコストはかかるため、この関数に入る手前でチェックを行う、といった方法の方がいい可能性もあります。 いずれにしても、配列外へのアクセスはちょっとした工夫で対処できるでしょう。 また、本当にこだわるならtemplateを技巧的に使い、引数(実行時)ではなくコンパイル時に解決してしまう、という作戦も、不可能ではないかと思います。 そこまでやるならinlineキーワードはぜひともつけるべきですねw >4について 上記のように、変更する場合はそういう配慮がいると思いますが 現状では while ( fn[--i] != '.' ) if ( !i ) return 0; このように、最初の長さが1以上でiが0までチェックされてやっぱりなかったらその時点で関数を抜け、FALSEを返すようになっているので問題ありません♪