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


         

Программа ищет все вхождения заданного


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

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