名 前
rpmatch − 質 問 へ の 応 答 が 肯 定 か 否 定 か を 判 定 す る
書 式
#include <stdlib.h>
int rpmatch(const char *response);
glibc 向 け の 機 能 検 査 マ ク ロ の 要 件 (feature_test_macros(7) 参 照 ):
rpmatch(): _SVID_SOURCE
説 明
rpmatch() は yes/no の 質 問 に 対 す る ユ ー ザ ー か ら の 応 答 を 処 理 す る 。 国 際 化 (I18N) に 対 応 し て い る 。
response に は ユ ー ザ ー か ら の 応 答 を 格 納 し た ヌ ル 終 端 文 字 列 が 入 っ て い る 必 要 が あ る 。 た い て い は 、 fgets(3) や getline(3) で 取 り 込 ん だ も の で あ ろ う 。 プ ロ グ ラ ム が setlocale(3) を 呼 び 出 し て 環 境 変 数 の 変 更 を 有 効 に し た 場 合 、 環 境 変 数 LANG, LC_MESSAGES, LC_ALL が ユ ー ザ ー の 言 語 設 定 と し て 考 慮 さ れ る 。 ロ ケ ー ル に 関 わ ら ず 、 ^[Yy] に マ ッ チ す る 応 答 は 常 に 肯 定 だ と 解 釈 さ れ 、 ^[Nn] に マ ッ チ す る 応 答 は 常 に 否 定 だ と 解 釈 さ れ る 。
返 り 値
response を 検 査 し た 後 、 rpmatch() は 否 定 的 な 応 答 ("no") と 認 識 し た 場 合 は 0 を 返 し 、 肯 定 的 な 応 答 ("yes") と 認 識 し た 場 合 は 1 を 返 す 。 response の 値 を 解 釈 で き な か っ た 場 合 は −1 を 返 す 。
エ ラ ー
返 り 値 −1 が 返 っ た 場 合 、 入 力 が 不 正 で あ っ た か 、 他 の 何 ら か の エ ラ ー が あ っ た こ と を 意 味 す る 。 返 り 値 が 0 以 外 か ど う か を 確 認 す る だ け で は 十 分 で は な い 。
rpmatch() は 、 regcomp(3) や regexec(3) が 失 敗 す る 理 由 の ど れ か で 失 敗 す る こ と が あ る 。 エ ラ ー の 原 因 を errno や 他 の 何 か で 知 る こ と は で き な い が 、 errno は 正 規 表 現 エ ン ジ ン の 失 敗 の 原 因 を 示 し て い る (但 し 、 こ の ケ ー ス と response の 値 を 認 識 で き ず に 失 敗 し た 場 合 を 区 別 す る こ と は で き な い )。
準 拠
rpmatch() は ど の 標 準 で も 必 須 と な っ て い な い が 、 Linux 以 外 に も 利 用 で き る シ ス テ ム も い く つ か は 存 在 す る 。
バ グ
rpmatch() の 実 装 は response の 最 初 の 1 文 字 だ け を 見 て い る よ う で あ る 。 そ の 結 果 、 "nyes" は 0 を 返 し 、 "ynever; not in a million years" は 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); }
関 連 項 目
fgets(3), getline(3), nl_langinfo(3), regcomp(3), setlocale(3)
こ の 文 書 に つ い て
こ の man ペ ー ジ は Linux man−pages プ ロ ジ ェ ク ト の リ リ ー ス 3.79 の 一 部 で あ る 。 プ ロ ジ ェ ク ト の 説 明 と バ グ 報 告 に 関 す る 情 報 は http://www.kernel.org/doc/man−pages/ に 書 か れ て い る 。