文字列を比較するには?

解決


MAXIM  2006-02-09 03:18:06  No: 60692

質問があります。
まず実力は初心者です。

処理の概要はテキストから読み取った一行のデータに対して、
処理の対象外文字列がないかをチェックするものです。

処理の詳細は、開始位置src_countのstrbuffをExclusion_chk_strに入れます。次に
先頭からstr_num文字分のExclusion_chk_strをExclusionbuffに入れる事により、
読み取った1行の中のチェックしたい文字列のみを抜き出します。
抜き取った文字列をobject_exclusion_check内で、処理対象外リストと比較し
結果を返し、それにより処理をするか処理をしないかというふうにしようと思っているの
ですが、どうもobject_exclusion_check内で比較する時に一致しなくてはいけないはずが
一致しません。

原因は比較するものの型が違う為だと思うのですが、どうしたらいいかが分かりません。
よろしくお願い致します。

【ソース】
int Input_anchar( char *in_dir, char *out_dir, char *file_name)
{
  char *strbuff = NULL ;
  char *Exclusion_chk_str = NULL ;
  char *Exclusionbuff = NULL ;

※※※※※※  省略  ※※※※※※

  // 処理対象除外なものか比較する文字列の取得
  strcpy( Exclusion_chk_str, &strbuff[src_count] ) ;
  strncpy( Exclusionbuff, Exclusion_chk_str, str_num ) ;

  // 処理対象除外でなければ処理を行う
  if( object_exclusion_check(&*Exclusionbuff)  == 0 )
  {
    outstrbuff[dis_count] = '\0' ;
    strcat( outstrbuff, ANCHOR_BGIN );
    dis_count += ANCHOR_BGIN_LEN;
  }

※※※※※※  省略  ※※※※※※

}

// 処理対象除外チェック
int object_exclusion_check( char *Exclusionbuff)
{
  FILE  *exclusion_file;
  char  exclusion_template[MAX_PATH] ;
  char  s[256] = NULL;

  // 処理対象除外ファイルのオープン
  if( (exclusion_file  = fopen( "e:\\exclusion.txt", "r" )) == NULL ) {
    fprintf( stderr, "file open error(%s)\n", exclusion_template );
  }

  // 処理対象外チェック
  while( fgets(s, 1024, exclusion_file) != NULL ){
    if( strcmp(Exclusionbuff, s) == 0)
    {
      fclose(exclusion_file);
      return 1;
    }
  }

  fclose(exclusion_file);
  return 0;

}

環境:OS Windows 2000  Visual C++ 6.0


tetrapod  2006-02-09 03:45:52  No: 60693

fgets は改行を読み込んで文字列の末尾に加えます(もしあれば)。
ということで改行なし文字列と改行あり文字列を strcmp し一致しないに一票。

以下蛇足。ツッコミどころが多すぎるので一部だけ。

strcmp で比較して大丈夫?大文字小文字は区別されますよ。
個人的には除外ファイルに正規表現を書きたいです。

毎回除外ファイル読むんですか?多分無駄すぎです。
除外ファイルって毎回開きなおす必要があるほど頻繁に更新されるのですか?
# それは設計レベルで間違っていると思う

> strcpy( Exclusion_chk_str, &strbuff[src_count] ) ;
ちゃんと Exclusion_chk_str に対して malloc なりなんなりバッファ割り当ててますか?

> if( object_exclusion_check(&*Exclusionbuff)  == 0 )
ポインタに関する理解が疑われるコードですけど大丈夫?


ヨロシコ  2006-02-09 17:57:13  No: 60694

文字列1に文字列2があるかどうかを調べるには、
「_mbsstr」でできませんでしたっけ!?
_mbsstr(文字列1,文字列2)で、存在すればその文字列のポインタが
かえってくる感じだったような。
if( _mbsstr(文字列1,文字列2) ){
     /*処理内容*/
     return 1;
}
間違ってたらごめんなさい。


Ban  2006-02-09 19:14:59  No: 60695

> 文字列1に文字列2があるかどうかを調べるには、
> 「_mbsstr」でできませんでしたっけ!?

処理自体は可能です。
ただし、特に理由がない限り、'_' で始まる関数はコンパイラ依存なので
C++ の標準関数である strstr または wcbstr の方がよい気もします。

# Windows 環境限定で、UNICODE対応が必要なため _tcsstr とか、
# そういう特別な理由はありえると思いますが。


MAXIM  2006-02-10 05:31:47  No: 60696

ご返信頂いた方感謝致します。
なんとか、目的が達成致しました。
しかし、出来たソースはつっこみどこ満載ですけど。


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

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






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