【掲示板ご利用上の注意】

 ※題名は具体的に!
 ※学校の課題の丸投げ禁止!
 ※ソースの添付は「HTML変換ツール」で字下げ!
 ※返信の引用は最小限に!
 ※環境(OSとコンパイラ)や症状は具体的に詳しく!
 ※返信付き投稿の削除は禁止!
 ※マルチポスト(多重投稿)は慎んで!

 詳しくはこちら


本当はこんなに大きく書きたくはないのですが、なかなか守っていただけなくて…。
 守ってくださいね。お願いします。(by管理人)

C言語ソース⇒HTML形式ツール掲示板2こちら


管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧

No.21983

マルチバイトコード対応文字列検索
投稿者---ようこ(2005/07/18 01:23:36)


UNIX環境(EUC)にて、マルチバイトコード対応(1バイト、2バイト)の
文字列検索の関数を作りたいのですが、EUCの場合、1バイトコードと
2バイトコードは、重複していないようなので、単純に長さ(バイト)で、比較するだけで大丈夫なのでしょうか?
よくわからいので、教えてください。


この投稿にコメントする

削除パスワード

発言に関する情報 題名 投稿番号 投稿者名 投稿日時
<子記事> Re:マルチバイトコード対応文字列検索 21986 shu 2005/07/18 15:57:58
<子記事> Re:マルチバイトコード対応文字列検索 21989 かずま 2005/07/18 18:26:53


No.21986

Re:マルチバイトコード対応文字列検索
投稿者---shu(2005/07/18 15:57:58)


なんらかの理由で、2バイトコードが1バイト分しか存在しない場合、
文字列として不自然かと思います。


この投稿にコメントする

削除パスワード

No.21989

Re:マルチバイトコード対応文字列検索
投稿者---かずま(2005/07/18 18:26:53)


> UNIX環境(EUC)にて、マルチバイトコード対応(1バイト、2バイト)の
> 文字列検索の関数を作りたいのですが、EUCの場合、1バイトコードと
> 2バイトコードは、重複していないようなので、単純に長さ(バイト)で、
> 比較するだけで大丈夫なのでしょうか?

だめです。

例えば、"十三" という文字列は bd bd bb b0 ですが、単純なバイト列として
検索すると "住" bd bb がマッチしてしまいます。

次のプログラムはちょっと手抜きですが、参考になりますか?
#include <stdio.h>

char *eucstr(const char *s1, const char *s2)
{
    for (;;) {
        const char *p1 = s1, *p2 = s2;  int c;
        do {
            if (!*p2) return (char *)s1;
        } while (*p1++ == *p2++);
        c = (unsigned char)*s1;
        if (!c) return NULL;
        s1 += (c>=0xa1 && c<=0xfe || c==0x8e) ? 2 : (c==0x8f) ? 3 : 1;
    }
}

int main(void)
{
    char s1[256], s2[256];

    while (scanf("%s%s", s1, s2) == 2) {
        char *p = eucstr(s1, s2);
        puts(p ? p : "not found");
    }
    return 0;
}



この投稿にコメントする

削除パスワード

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧