拡張子を取得するには

解決


Cの使用者  2004-11-16 03:29:22  No: 55189  IP: [192.*.*.*]

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

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

編集    削除
シャノン  2004-11-16 05:39:25  No: 55190  IP: [192.*.*.*]

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

編集    削除
Cの使用者  2004-11-16 05:56:21  No: 55191  IP: [192.*.*.*]

あれ?  違いましたか?

編集    削除
Blue  2004-11-16 07:21:31  No: 55192  IP: [192.*.*.*]

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

if ( s == ".html" ) 

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

編集    削除
シャノン  2004-11-16 18:52:03  No: 55193  IP: [192.*.*.*]

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

ワンクッション置いて

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

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

編集    削除
Cの使用者  2004-11-17 05:12:51  No: 55194  IP: [192.*.*.*]

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

編集    削除
瀬戸っぷ  2004-11-17 05:22:21  No: 55195  IP: [192.*.*.*]

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  IP: [192.*.*.*]

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

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  IP: [192.*.*.*]

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

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

編集    削除
RAPT  2004-11-18 09:54:13  No: 55198  IP: [192.*.*.*]

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

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

編集    削除
Cの使用者  2004-11-19 06:48:31  No: 55199  IP: [192.*.*.*]

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

編集    削除
Ban  2004-11-19 07:37:26  No: 55200  IP: [192.*.*.*]

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

編集    削除
Cの使用者  2004-11-21 07:16:19  No: 55201  IP: [192.*.*.*]

あ、こんな感じですか?

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  IP: [192.*.*.*]

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

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  IP: [192.*.*.*]

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

編集    削除