本ページは公開が終了した情報の複製であり、掲載時点での情報です。本ページに記載されている内容について各所に問い合わせることはご遠慮下さい。
サポート技術情報

[QC20]jstrmatch, jstrskip 関数の障害

文書番号: 402711

最終更新日: 1998/03/23


この資料は以下の製品について記述したものです。


この記事は、以前は次の ID で公開されていました: JP402711

概要

この資料は、jstrmatch 関数 jstrskip 関数の障害について説明したものです。

詳細

検索対象文字列 (第2引数の文字列) 中に全角文字がある場合、その全角文字の
2byte 目のコードに該当する半角文字も検索対象にしてしまいます。

再現プログラム

  #include <jstring.h>
  #include <jctype.h>
  #include <stdio.h>
  void main()
  {
      char str1[] = "abc";
      char str2[] = "B";
      char *p;
      int   cnt;
      printf("\"abc\"から\"B\"を検出\n\n");
      p = str1;
      cnt = 0;
      while ( ( p = jstrmatch2( p, str2 ) ) ) {
          cnt++;
          p += ( iskanji( *p ) ? 2 : 1 );
      }
      printf( "\"B\"を %d 個検出\n", cnt );
      p = str1;
      cnt = 0;
      while ( ( p = jstrskip2( p, str2 ) ) ) {
          cnt++;
          p += ( iskanji( *p ) ? 2 : 1 );
      }
      printf( "\"B\"以外の文字を %d 個検出\n", cnt );
  }

原因

これは、この関数が全角文字の 2byte 目を 1byte 文字として認識しているために生じる 障害です。

対処方法

以下の関数をご自分でソースに追加し、こちらをお使いください。
  unsigned char * _CDECL jstrmatch2( const unsigned char *string,
  const unsigned char *charset )
  {
      unsigned char *p, *q;
      for (q = (char *)string; *q != '\0'; q++) {
          for (p = (char *)charset; *p != '\0'; p++) {
            if (iskanji(*p)) {
                  if (((*p == *q) && (p[1] == q[1])) || p[1] == '\0')
                      break;
                  p++;
              }
              else if (*p == *q)      break;
          }
          if (*p != '\0')
              break;
          if (iskanji(*q))
              if (*++q == '\0')
                  break;
      }
      return((*q)?q:(char *)0);
  }
  unsigned char * _CDECL jstrskip2( const unsigned char *string,
  const unsigned char *charset )
  {
      unsigned char *p, *q;
      for (q = (char *)string; *q; q++) {
          for (p = (char *)charset; *p; p++) {
              if (iskanji(*p)) {
                  if (((*p == *q) && (p[1] == q[1])) || p[1] == '\0')
                      break;
                  p++;
              }
              else if (*p == *q)      break;
          }
          if(*p == '\0')
              break;
          if (iskanji(*q))
              if (*++q == '\0')
                  break;
      }
      return((*q)?q:(char *)0);
  }

詳細

  • Visual C++ は、米国 Microsoft Corporation の商標です。

Keywords: KBBUG KB402711
Technology: kbAudDeveloper kbCCompSearch kbQC200 kbZNotKeyword3

inserted by FC2 system