C регулярные выражения: извлечение фактических совпадений

Я использую регулярные выражения в C (используя библиотеку "regex.h"). После настройки стандартных вызовов (и проверок) для regcomp (...) и regexec (...) я могу только распечатать фактические подстроки, которые соответствуют моему скомпилированному регулярному выражению. Использование regexec, согласно страницам руководства, означает, что вы сохраняете совпадения подстрок в структуре, известной как "regmatch_t". Структура содержит только rm_so и rm_eo для ссылки на то, что я понимаю как адреса символов совпадающей подстроки в памяти, но мой вопрос заключается в том, как я могу просто использовать их для смещения и двух указателей, чтобы извлечь фактическую подстроку и сохранить ее в массив (в идеале 2D-массив строк)?

Он работает, когда вы просто печатаете в стандартный формат, но всякий раз, когда вы пытаетесь использовать ту же настройку, но сохраняете ее в массиве строк / символов, она сохраняет всю строку, которая первоначально использовалась для сопоставления с выражением. Кроме того, что такое "%. * S" внутри оператора print? Я полагаю, что это само по себе регулярное выражение для правильного чтения в указателях на массив символов. Я просто хочу сохранить соответствующие подстроки внутри коллекции, чтобы я мог работать с ними в другом месте в моем программном обеспечении.

Справочная информация: p и p2 оба указателя установлены так, чтобы они указывали на начало строки для сопоставления перед входом в цикл while в приведенном ниже коде: [EDIT: «совпадения» - это двумерный массив, предназначенный для окончательного хранения совпадений подстроки и предварительно выделенный / инициализированный перед основным циклом вы видите ниже]

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

Ответы на вопрос(2)

Ваш ответ на вопрос