0

次のような文字列があります。

long_str = "returns between paragraphs 20102/34.23\" - 9203 1232 \"test\" \"basic HTML\"";

注: 引用符は文字列の一部です。

int match(char *long_str){
    char * str;
    if ((str = strchr(long_str, '"')) != NULL) str++; // last " ?
    else return 1;
    return 0;
}

を使用しstrstrて、最後の 2 つの引用符の間の部分文字列全体を取得しようとしています: "basic HTML". 私は、その一致を取得するための適切で効率的な方法が何であるかがよくわかりません. これにアプローチする方法については、他のアイデアを受け入れます。ありがとう

4

2 に答える 2

1
#include <stdio.h>

char * long_str = 
"returns between paragraphs 20102/34.23\" - 9203 1232 \"test\" \"basic HTML\"";

int main ()
{
    char * probe;
    char * first_quote = 0;
    char * second_quote = 0;
    for (probe = long_str; * probe; probe++) {
        if (*probe == '"') {
            if (first_quote) {
                if (second_quote) {
                    first_quote = second_quote;
                    second_quote = probe;
                } else {
                    second_quote = probe;
                }
            } else {
                first_quote = probe;
            }
        }
    }
    printf ("%s\n", first_quote);
    printf ("%d-%d\n", first_quote - long_str, second_quote - long_str);
    return 0;
}
于 2010-04-04T05:30:20.727 に答える
0

ソース文字列を変更できないと仮定すると、ライブラリ関数をすべてに使用したい場合は、strchr()との組み合わせを検討する必要があると思います。strrchr()

  • strrchr()最後の引用を見つけるために最初に使用します。
  • strchr()次に、 で見つかった最後の引用が返されるまで、 を繰り返し使用して先頭から引用を検索しますstrrchr()
  • 前の結果と の結果の組み合わせにより、strrchr()関心のある文字列を引用符で囲みます。

または:

  • strrchr()最後の引用を見つけるために最初に使用します。
  • そこから逆方向に検索して前の引用符を見つけるループを作成します。文字列の形式が正しくなく、引用符が 1 つしか含まれていない場合は、文字列の開始前を検索しないように注意してください。

どちらも機能します。確率のバランスに応じて、高度に最適化strchr()されたループでラップされた場合でも、ループが優れたパフォーマンスを発揮する可能性は十分にあります。

于 2010-04-04T05:16:24.603 に答える