rpmatch — determine if the answer to a question is affirmative or negative
#include <stdlib.h>
int rpmatch( |
const char *response) ; |
![]() |
Note | ||
---|---|---|---|
|
rpmatch
() handles a user
response to yes or no questions, with support for
internationalization.
response
should be
a null-terminated string containing a user-supplied response,
perhaps obtained with fgets(3) or getline(3).
The user's language preference is taken into account per
the environment variables LANG
,
LC_MESSAGES
, and LC_ALL
, if the program has called setlocale(3) to effect
their changes.
Regardless of the locale, responses matching ^[Yy]
are always accepted as
affirmative, and those matching ^[Nn]
are always accepted as
negative.
After examining response
, rpmatch
() returns 0 for a recognized
negative response ("no"), 1 for a recognized positive
response ("yes"), and −1 when the value of response
is unrecognized.
A return value of −1 may indicate either an invalid input, or some other error. It is incorrect to only test if the return value is nonzero.
rpmatch
() can fail for any
of the reasons that regcomp(3) or regexec(3) can fail; the
cause of the error is not available from errno
or anywhere else, but indicates a
failure of the regex engine (but this case is
indistinguishable from that of an unrecognized value of
response
).
The rpmatch
() implementation
looks at only the first character of response
. As a consequence,
"nyes" returns 0, and "ynever; not in a million years"
returns 1. It would be preferable to accept input strings
much more strictly, for example (using the extended regular
expression notation described in regex(7)): ^([yY]|yes|YES)$
and
^([nN]|no|NO)$
.
The following program displays the results when
rpmatch
() is applied to the
string given in the program's command-line argument.
#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); }