拡張子を取得するには

解決


Cの使用者  2004-11-16 03:29:22  No: 55189

ファイルを選択させ、拡張子によって処理を振り分ける、というようなことをやりたいのですが、うまくいきません。このコードはどこがおかしいのか、どなたか教えてください。

char CheckFileType(char *FileName)
{
  char *s;
  s=PathFindExtension(FileName);
  if(s == ".html"){
    //拡張子がhtmlのときの処理
  }   
  else{
     違うときの処理
  }
}


シャノン  2004-11-16 05:39:25  No: 55190

C の文字列について勉強しなおしてください。
C では、文字列の同一性は == では比較できません。


Cの使用者  2004-11-16 05:56:21  No: 55191

あれ?  違いましたか?


Blue  2004-11-16 07:21:31  No: 55192

現在の s にどんな値が設定されているかを確認して

if ( s == ".html" ) 

の判定処理を考えてみてください。
ちなみに、".html"は文字列".html"の示す先頭アドレスを指します。


シャノン  2004-11-16 18:52:03  No: 55193

> ちなみに、".html"は文字列".html"の示す先頭アドレスを指します。

ワンクッション置いて

const char * html = ".html";
if( s == html ) {

と書き直してみるとわかりやすいかも。


Cの使用者  2004-11-17 05:12:51  No: 55194

文字列の同一性はどのようにして比較すればよいのですか?


瀬戸っぷ  2004-11-17 05:22:21  No: 55195

http://www.google.co.jp/search?hl=ja&q=C%E8%A8%80%E8%AA%9E+%E6%96%87%E5%AD%97%E5%88%97+%E6%AF%94%E8%BC%83&btnG=Google+%E6%A4%9C%E7%B4%A2&lr=lang_ja

折角ネット使えるのですから検索してみましょう。


Blue  2004-11-17 08:07:32  No: 55196

> 文字列の同一性はどのようにして比較すればよいのですか?

const char* html = ".html";

if ( ( *s == *html ) &&
     ( *( s + 1 ) == *( html + 1 ) ) &&
     ( *( s + 2 ) == *( html + 2 ) ) &&
     ( *( s + 3 ) == *( html + 3 ) ) &&
     ( *( s + 4 ) == *( html + 4 )) )
{
    // 拡張子がhtmlのときの処理    

ぐらいの返信を期待したのは私だけでしょうか?w
strcmpすぐ使っちゃうとあいまいな知識になってしまうような気がします。


Cの使用者  2004-11-18 03:59:15  No: 55197

皆さん、ありがとうござしました。

結局、「ラク」だったので、strcmpを使うことにしました。
ふっとわいた、strcmpはどのような仕組みだろうという疑問も、Blueさんの説明で理解できました。


RAPT  2004-11-18 09:54:13  No: 55198

> ふっとわいた、strcmpはどのような仕組みだろうという疑問も、Blueさんの説明で理解できました。

ホントですか?
strcmp()に相当する関数かけますか?


Cの使用者  2004-11-19 06:48:31  No: 55199

いや・・。配列の個数を取得する方法がわかりません。


Ban  2004-11-19 07:37:26  No: 55200

ヒント:C の文字列は最後に必ず何かがあるはずです。


Cの使用者  2004-11-21 07:16:19  No: 55201

あ、こんな感じですか?

int (char *string[], char *cmp)
{
  int x;
   for(x =0; string[x] == NULL; ++x){
   
   if( *(string[x]) == *(cmp[x]))
  }
}


RAPT  2004-11-21 07:48:23  No: 55202

それ、コンパイルできません。

strcmp()関数のプロトタイプは以下のとおり。
int strcmp(const char *, const char *);

書き方はいくつかあるでしょうが、
int my_strcmp(const char *a, const char *b)
{
    while(*a != '\0' && *b != '\0' && *a == *b){
        ++a, ++b;
    }
    if(*a == *b){
        return 0;
    }else if(*a > *b){
        return 1;
    }else{
        return -1;
    }
}
とか。

最後のところは自分だったら3項演算子で次のように書きますが。
    return (*a < *b)? -1 : (*a != *b);


Cの使用者  2004-11-21 08:10:56  No: 55203

なるほど。
皆さん、もう「解決」のチェックをつけてしまったのにもかかわらず、ありがとうございました。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加