C言語関係掲示板

過去ログ

No.341.特定のパターンの文字列を削除

[戻る] [ホームページ]
No.2163

文字列について
投稿者---おっすん(2002/07/23 19:52:05)


いつも参考にさせて頂いております。
ところで質問がございます。

void CheckStr( char FAR* str )
{
}
という関数をつくりまして、strに入っている文字列の処理をしたいのです。
文字列に以下の文章が入っているとします。
・・・%%100,カテゴリ1%%・・・・%%200,カテゴリ2%%・・・

そこから、%%100,%% %%200,%%を取り除きたい。
結局、
・・・カテゴリ1・・・・カテゴリ2にしたいのです。
実際には、カテゴリ1をクリックさせて100というイベントの処理を行います。

イベントの処理以前に、どうしても%%100,%%が消せません。
何かよいアドバイス等がございましたら、よろしくお願いいたします。



No.2164

Re:文字列について
投稿者---かずま(2002/07/23 22:05:13)


> いつも参考にさせて頂いております。

本当に参考にしていますか。7月19日に、ある文字列から、特定のパターンの文字列を
削除するというのがあったばかりですよ。No.2129「コメント文の削除」のスレッドです。
#include <stdio.h>

enum State { INITIAL, PERCENT, EVENT, CATEGORY, PERCENT2 };
enum State state = INITIAL;

void CheckStr(char *str)
{
    int c;  char *s2 = str;

    while (c = *str++) {
        switch (state) {
        case INITIAL:
            if (c == '%') { state = PERCENT; break; }
            *s2++ = c; break;
        case PERCENT:
            if (c == '%') { state = EVENT; break; }
            *s2++ = '%'; *s2++ = c; break;
        case EVENT:
            if (c == ',') state = CATEGORY;
            break;
        case CATEGORY:
            if (c == '%') { state = PERCENT2; break; }
            *s2++ = c; break;
        case PERCENT2:
            if (c == '%') { state = INITIAL; break; }
            *s2++ = '%'; *s2++ = c; break;
        }
    }
    *s2 = '\0';
}

int main()
{
    char buf[1024];

    while (fgets(buf, sizeof buf, stdin)) {
        CheckStr(buf);
        fputs(buf, stdout);
    }
    return 0;
}


No.2181

Re:文字列について
投稿者---おっすん(2002/07/25 16:38:35)


かずま様、ありがとうございました。
うまく除去することができました。

実は、もう少し質問がございます。
この%%100,カテゴリ1%%の
%%100,が何文字め(何バイトめ)から何文字め(何バイトめ)までか
終わりの%%が何文字め(何バイトめ)から何文字め(何バイトめ)までかを
知りたい時には、
先程、教えて頂いたソースに何かを追加すればよいのでしょうか?
それともそんなことは、別処理として、行わないといけないのでしょうか?

No.2185

Re:文字列について
投稿者---かずま(2002/07/25 18:22:52)


> この%%100,カテゴリ1%%の %%100,が何文字め(何バイトめ)から何文字め(何バイトめ)までか
> 終わりの%%が何文字め(何バイトめ)から何文字め(何バイトめ)までかを知りたい時には、

1バイトずつ文字列を見ていっているのだから、今どこなのかはすぐわかるはずですが、
何が難しいんでしょうか。
#include <stdio.h>

enum State { INITIAL, PERCENT, EVENT, CATEGORY, PERCENT2 };
enum State state = INITIAL;

int CheckStr(char *str, int *pos)
{
    int c, i = 0;  char *s1, *s2;

    s1 = s2 = str;
    while (c = *s1++) {
        switch (state) {
        case INITIAL:
            if (c == '%') { state = PERCENT; break; }
            *s2++ = c; break;
        case PERCENT:
            if (c == '%') { pos[i++] = s1-str-2; state = EVENT; break; }
            *s2++ = '%'; *s2++ = c; break;
        case EVENT:
            if (c == ',') { pos[i++] = s1-str-1; state = CATEGORY; }
            break;
        case CATEGORY:
            if (c == '%') { state = PERCENT2; break; }
            *s2++ = c; break;
        case PERCENT2:
            if (c == '%') {
                pos[i++] = s1-str-2; pos[i++] = s1-str-1;
                state = INITIAL; break;
            }
            *s2++ = '%'; *s2++ = c; break;
        }
    }
    *s2 = '\0';
    return i;
}

int main()
{
    char buf[] = "abcdef%%100,カテゴリ1%%ghijklmn%%200,カテゴリ2%%opqrst";
    int pos[100], n, i;

    puts(buf);
    n = CheckStr(buf, pos);
    for (i = 0; i < n; i++)
        printf(" %d", pos[i]);
    puts("");
    puts(buf);
    return 0;
}