C Expresiones regulares: Extracción de coincidencias reales

Estoy usando expresiones regulares en C (usando la biblioteca "regex.h"). Después de configurar las llamadas (y verificaciones) estándar para regcomp (...) y regexec (...), solo puedo imprimir las subcadenas reales que coinciden con mi expresión regular compilada. El uso de regexec, de acuerdo con las páginas del manual, significa que almacena las coincidencias de subcadenas en una estructura conocida como "regmatch_t". La estructura solo contiene rm_so y rm_eo para hacer referencia a lo que entiendo que son las direcciones de los caracteres de la subcadena coincidente en la memoria, pero mi pregunta es cómo puedo usar estas para compensaciones y dos punteros para extraer la subcadena real y almacenarla una matriz (idealmente una matriz 2D de cadenas)?

Funciona cuando solo imprime a la salida estándar, pero cuando intenta utilizar la misma configuración pero la almacena en una matriz de cadena / carácter, almacena toda la cadena que originalmente se usó para coincidir con la expresión. Además, ¿qué es el "%. * S" dentro de la declaración de impresión? Me imagino que es una expresión regular en sí misma para leer correctamente los punteros a una matriz de caracteres. Solo quiero almacenar las subcadenas coincidentes dentro de una colección para poder trabajar con ellas en otro lugar en mi software.

Antecedentes: p y p2 tienen ambos punteros configurados para indicar el inicio de la cadena para que coincidan antes de ingresar al bucle while en el siguiente código: [EDITAR: "coincidencias" es una matriz 2D diseñada para almacenar las coincidencias de subcadenas y se preasignó / inicializó antes del bucle principal se ve a continuación]

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

Respuestas a la pregunta(2)

Su respuesta a la pregunta