0

私が探しているのは、基本的には括弧内のテキストを抽出することと同等であり、それが私が使用する例です。私の入力が(test 1 2)(test 3 4)test foo bar(test again)以下のコードのようなものである場合、私が望むものを正確に返します:

token: test 1 2
token: test 3 4
token: test again

しかし、私の入力(test 1 (test 2 3)foo(bar test) again)

token: test 1 
token: test 2 3
token: bar test

見たくないtest 1。はい、左括弧と右括弧の間にありますが、このデータのさらに上流で何か問題が発生したことを意味します。

void print_tokens(char *s) {
    printf("input: %s\n",s);
    char *output;
    const char *valid = "abcdefghijklmnopqrstuvwxyz0123456789 ";
    unsigned int length;
    s=strchr(s,'(')+1;
    length=strspn(s,valid);
    while(s!=NULL && length>0) {
        output=malloc(length+1);
        strncpy(output,s,length);
        output[length]='\0';
        printf("token: %s\n",output);
        free(output);
        if(strchr(s,'(')!=NULL) {
            s=strchr(s,'(')+1;
            length=strspn(s,valid);
        } else {
            s=NULL;
        }
    }
}

メモリ管理がかなり緩いことは別として、このスラップダッシュアプ​​ローチは、別の関数があるため「十分に近い」可能性があります(出力が実際に渡され、独自の入力をチェックしますが、これでもいくつかの可能性があります)私が探しているものは正規表現で簡単に要約できますが (/.*\(([a-z0-9 ]*?)\)/私は信じています)、多かれ少なかれ標準的な C でなければなりません.GNU C 、Boost、および文字列の解析や正規表現に役立つ他のライブラリのほとんどは利用できません。

余分なトークンを排除するこのテキストを引き出すより良い方法はありますか? また、有効な文字セット (たとえば、左右の括弧以外のすべて) をより柔軟に使用できますか?

4

2 に答える 2

1

これはちょうどそれを行う必要があります:

#include <stdlib.h>
#include <string.h>
#include <stdio.h>

void print_tokens(char *s)
{
    printf("input: %s\n", s);
    char *start = s;
    char *end = s;
    while(*s) {
        if(*s == '(') start = s;
        else if(*s == ')') end = s;
        if(start < end && *start) {
              *end = 0;
              printf("token: %s\n", start+1);
              start = s = end;
        }
        s++;
    }
}

int main()
{
    char str[] = "(test 1 (test 2 3)foo(bar test) again)";
    char str2[] = "(test 1 2)(test 3 4)test foo bar(test again)";
    print_tokens(str);
    print_tokens(str2);
    return 0;
}

あなたが私にくれた両方のテストケースで動作します。元の文字列が上書きされることに注意してください。そのため、文字列を複製したくない場合は、コードを追加して文字列を複製する必要があります。

于 2013-11-14T19:58:25.377 に答える