C Wyrażenia regularne: wyodrębnianie rzeczywistych dopasowań

Używam wyrażeń regularnych w C (używając biblioteki „regex.h”). Po ustawieniu standardowych wywołań (i sprawdzeń) dla regcomp (...) i regexec (...), mogę tylko wydrukować rzeczywiste podciągi, które pasują do mojego skompilowanego wyrażenia regularnego. Używanie regexec, zgodnie ze stronami podręcznika, oznacza, że ​​zapałki są przechowywane w strukturze znanej jako „regmatch_t”. Struktura zawiera tylko rm_so i rm_eo, aby odnieść się do tego, co rozumiem jako adresy znaków dopasowanego podciągu w pamięci, ale moje pytanie brzmi, jak mogę po prostu użyć ich do przesunięcia i dwóch wskaźników, aby wyodrębnić rzeczywisty podciąg i zapisać go w tablica (najlepiej tablica ciągów 2D)?

Działa, gdy drukujesz tylko do standardowego wyjścia, ale za każdym razem, gdy próbujesz użyć tej samej konfiguracji, ale zapisujesz ją w tablicy znaków / znaków, przechowuje cały łańcuch, który był pierwotnie używany do dopasowania do wyrażenia. Co to jest „%. * S” w instrukcji drukowania? Wyobrażam sobie, że samo wyrażenie regularne odczytuje wskaźniki do tablicy znaków poprawnie. Chcę tylko przechowywać dopasowane podciągi w kolekcji, aby móc pracować z nimi w innym miejscu mojego oprogramowania.

Tło: p i p2 są wskaźnikami ustawionymi tak, aby wskazywały początek łańcucha, który ma zostać dopasowany, przed wprowadzeniem pętli while w poniższym kodzie: [EDIT: „mecze” to tablica 2D przeznaczona do ostatecznego przechowywania dopasowań podciągu i została wstępnie przydzielona / zainicjowana przed główną pętlą, którą widzisz poniżej]

int ind = 0;
while(1){
    regExErr1 = regexec(&r, p, 10, m, 0);
    //printf("Did match regular expr, value %i\n", regExErr1);
    if( regExErr1 != 0 ){ 
        fprintf(stderr, "No more matches with the inherent regular expression!\n"); 
        break; 
    }   
    printf("What was found was: ");
    int i = 0;
    while(1){
        if(m[i].rm_so == -1){
            break;
        }
        int start = m[i].rm_so + (p - p2);
        int finish = m[i].rm_eo + (p - p2);
        strcpy(matches[ind], ("%.*s\n", (finish - start), p2 + start));
        printf("Storing:  %.*s", matches[ind]);
        ind++;
        printf("%.*s\n", (finish - start), p2 + start);
        i++;
    }
    p += m[0].rm_eo; // this will move the pointer p to the end of last matched pattern and on to the start of a new one
}
printf("We have in [0]:  %s\n", temp);

questionAnswers(2)

yourAnswerToTheQuestion