C Expressões Regulares: Extrair as Correspondências Reais

Eu estou usando expressões regulares em C (usando a biblioteca "regex.h"). Depois de configurar as chamadas padrão (e verificações) para regcomp (...) e regexec (...), só consigo imprimir as subseqüências reais que correspondem à minha expressão regular compilada. Usar regexec, de acordo com as páginas de manual, significa armazenar as correspondências de substring em uma estrutura conhecida como "regmatch_t". A estrutura contém apenas rm_so e rm_eo para referenciar o que eu entendo ser os endereços dos caracteres da substring correspondente na memória, mas minha pergunta é como posso usá-los apenas para deslocamentos e dois ponteiros para extrair a substring real e armazená-los em um array (idealmente um array 2D de strings)?

Ele funciona quando você simplesmente imprime para o padrão, mas sempre que você tenta usar a mesma configuração, mas armazená-la em uma matriz de seqüência de caracteres / caractere, ela armazena a seqüência inteira que foi originalmente usada para combinar com a expressão. Além disso, o que é o "%. * S" dentro da declaração de impressão? Eu imagino que é uma expressão regular em si para ler os ponteiros para um array de caracteres corretamente. Eu só quero armazenar as substrings combinadas dentro de uma coleção para que eu possa trabalhar com elas em outro lugar no meu software.

Background: p e p2 são ambos ponteiros definidos para apontar para o início da string para corresponder antes de inserir o loop while no código abaixo: [EDIT: "matches" é uma matriz 2D destinada a armazenar as correspondências de substring e foi pré-alocada / initalized antes do loop principal que você vê abaixo]

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);