2009年11月11日水曜日

C言語で拡張子判別

 だが、記述はC++だという


#include <cstring>
#include <cstdio>


bool CheckExtention( const char* filename, const char* ext )
{
  if ( filename && ext )
  {
    return 0 == std::strcmp(std::strrchr(filename, '.'), ext);
  }

  return false;
}


int main()
{
  const char* ext1 = ".png";
  const char* ext2 = ".jpg";
  const char* filename = "filename.png";
  std::printf("%s\n", CheckExtention(filename, ext1) ? "true" : "false");
  std::printf("%s\n", CheckExtention(filename, ext2) ? "true" : "false");

  return 0;
}


 実行結果


true!
false!



 おおよそこんな感じか。strcmpでは大文字小文字を区別してしまうので良くないんだけど、C言語標準にはstricmpがないので適当に自作しなければならない。strlenしてtolowerしながら比較すればいいのかな?
 WINAPIならPathFindExtensionってのがあるのでそれとlstrmpiあたり。
tchar.hをつかうならば_tcsrchrと_tcsicmpあたりか。

 拡張子チェックするだけなのに意外に手間取った。文字列操作はちょっとした鬼門だ。


int stricmp( const char* s1, const char* s2 )
{
  while ( (*s1) && std::tolower(*s1) == std::tolower(*s2) )
  {
    s1++;
    s2++;
  }
  return std::tolower(*s1) - std::tolower(*s2);
}


 stricmpを調べてみたら大体このようなことをするらしい。

0 件のコメント: