Программирование в стандарте POSIX



         

Пример 6.35


#include

#include

#include

/* Программа ищет все вхождения заданного шаблона во всех входных строках */

/* и выводит успешно сопоставленные подцепочки */

#define PATTERN "[A-Za-z][A-Za-z0-9]{0,31}"

int main (void) {

char line [LINE_MAX]; /* Буфер для входных строк */

char *pline; /* Указатель на начало сопоставляемой части строки */

regex_t cere; /* Скомпилированное расширенное регулярное выражение */

regmatch_t pm; /* Структура для запоминания границ сопоставленной подцепочки */

int reerrcode; /* Код ошибки от regcomp или regexec */

char reerrbuf [LINE_MAX]; /* Буфер для строк с сообщениями об ошибках */

int i;

if ((reerrcode = regcomp (&cere, PATTERN, REG_EXTENDED)) != 0) {

(void) regerror (reerrcode, &cere, reerrbuf, sizeof (reerrbuf));

fputs (reerrbuf, stderr);

fputc ('\n', stderr);

regfree (&cere);

return (reerrcode);

}

fputs ("Вводите строки, сопоставляемые с шаблоном " PATTERN "\n", stdout);

while (fgets (line, sizeof (line), stdin) != NULL) {

/* Произведем первое сопоставление с прочитанной строкой. */

/* Оно отличается от остальных при наличии в шаблоне фиксатора начала */

reerrcode = regexec (&cere, pline = line, 1, &pm, 0);

while (reerrcode == 0) {

/* Повторяем, пока сопоставления с остатком строки успешны */

fputs ("Сопоставленная подцепочка: ", stdout);

for (pline += pm.rm_so, i = pm.rm_eo - pm.rm_so; i-- > 0; ) {

fputc (*pline++, stdout);

}

fputc ('\n', stdout);

reerrcode = regexec (&cere, pline, 1, &pm, REG_NOTBOL);

}

}

regfree (&cere);

return (ferror (stdin) || ferror (stdout));

}




Содержание  Назад  Вперед