rpmatch(3) определяет, является ли ответ на вопрос утвердительным или

ОБЗОР

#include <stdlib.h>
int rpmatch(const char *response);

Требования макроса тестирования свойств для glibc (см. feature_test_macros(7)):

rpmatch(): _SVID_SOURCE

ОПИСАНИЕ

Функция rpmatch() обрабатывает ответ пользователя «да» или «нет» на вопросы, учитывая интернационализацию.

В аргументе response должен указываться ответ пользователя в виде строки, заканчивающейся null, полученной, например, с помощью fgets(3) или getline(3).

Пользовательские языковые настройки определяются с помощью переменных окружения LANG, LC_MESSAGES и LC_ALL, если для их учёта программа вызывала setlocale(3).

Вне зависимости от локали, ответы, соответствующие ^[Yy], всегда считаются утвердительными, а соответствующие ^[Nn], всегда принимаются за отрицательные.

ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ

После проверки response, функция rpmatch() возвращает 0 при найденном отрицательном ответе («нет»), 1 при положительном ответе («да») и -1, когда значение response не распознано.

ОШИБКИ

Возвращаемое значение -1 может указывать на неправильные входные данные, либо какую-то другую ошибку. Не стоит проверять является ли возвращаемое значение лишь отличным от нуля.

Функция rpmatch() может завершиться с ошибкой по любой из причин, по которым могут не выполниться regcomp(3) или regexec(3); причина ошибки не указывается в errno или где-то ещё — это указывает на ошибку в самом механизме regex (но этот случай не отличается от нераспознанных значений response).

АТРИБУТЫ

Описание терминов данного раздела смотрите в attributes(7).
ИнтерфейсАтрибутЗначение
rpmatch() безвредность в нитяхбезвредно (MT-Safe locale)

СООТВЕТСТВИЕ СТАНДАРТАМ

Функция rpmatch() не является стандартной, но доступна в некоторых других системах.

ДЕФЕКТЫ

Реализация rpmatch() учитывает лишь первый символ response. Так что, «ну, да.» вернёт 0, а «да нет же, ни за что!» вернёт 1. Правильнее было бы использовать расширенные правила для обработки входных строк (использования дополненных регулярных выражений описано в regex(7)): ^([yY]|yes|YES)$ и ^([nN]|no|NO)$.

ПРИМЕР

Следующая программа показывает результаты, когда в rpmatch() передана строка, полученная программой из командной строки.
#define _SVID_SOURCE
#include <locale.h>
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
int
main(int argc, char *argv[])
{
    if (argc != 2 || strcmp(argv[1], "--help") == 0) {
        fprintf(stderr, "%s response\n", argv[0]);
        exit(EXIT_FAILURE);
    }
    setlocale(LC_ALL, "");
    printf("rpmatch() returns: %d\n", rpmatch(argv[1]));
    exit(EXIT_SUCCESS);
}