извлечение вхождения строки в c - PullRequest
0 голосов
/ 04 апреля 2010

У меня есть строка, которая выглядит примерно так:

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 Я пытаюсь получить всю подстроку между двумя последними кавычками: "basic HTML". Я просто не совсем уверен, что будет хорошим и эффективным способом получить этот матч. Я открыт для любых других идей о том, как подойти к этому. Спасибо

Ответы [ 2 ]

1 голос
/ 04 апреля 2010
#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;
}
0 голосов
/ 04 апреля 2010

Предполагая, что вы не можете изменить исходную строку, тогда я думаю, что вы должны рассмотреть комбинацию strchr() и strrchr() - по крайней мере, если вы хотите использовать библиотечные функции для всего.

  • Первое использование strrchr(), чтобы найти последнюю цитату.
  • Затем несколько раз используйте strchr(), чтобы найти цитаты спереди, до того момента, пока он не вернет последнюю цитату, найденную strrchr().
  • Сочетание предыдущего результата и результата strrchr() дает вам кавычки вокруг интересующей вас строки.

С другой стороны:

  • Сначала используйте strrchr(), чтобы найти последнюю цитату.
  • Напишите цикл для поиска в обратном направлении, чтобы найти предыдущую цитату, помня не искать до начала строки в случае, если она искажена и содержит только одну цитату.

Оба будут работать. В зависимости от баланса вероятностей вполне возможно, что цикл превзойдет даже высоко оптимизированный strchr(), заключенный в цикл.

...