名 前
scanf, fscanf, sscanf, vscanf, vsscanf, vfscanf − 書 式 付 き 入 力 変 換
書 式
#include <stdio.h>
int
scanf(const char *format, ...);
int fscanf(FILE *stream, const char
*format, ...);
int sscanf(const char *str, const char
*format, ...);
#include <stdarg.h>
int
vscanf(const char *format, va_list
ap);
int vsscanf(const char *str, const char
*format, va_list ap);
int vfscanf(FILE *stream, const char
*format, va_list ap);
glibc 向 け の 機 能 検 査 マ ク ロ の 要 件 (feature_test_macros(7) 参 照 ):
vscanf(), vsscanf(), vfscanf():
_XOPEN_SOURCE >= 600 || _ISOC99_SOURCE || _POSIX_C_SOURCE >= 200112L; ま た は cc −std=c99
説 明
scanf() 関 数 グ ル ー プ は 、 以 下 に 述 べ る よ う に 、 format に 従 っ て 入 力 を 読 み 込 む も の で あ る 。 こ の 書 式 に は 「 変 換 指 定 」 (conversion specifications) を 含 め る こ と が で き 、 変 換 指 定 が あ れ ば 、 そ の 変 換 の 結 果 は format に 続 く pointer 引 き 数 が 指 す 場 所 に 格 納 さ れ る 。 そ れ ぞ れ の pointer 引 き 数 の 型 は 、 対 応 す る 変 換 指 定 が 返 す 値 に 適 合 し て い な け れ ば な ら な い 。
format 中 の 変 換 指 定 の 個 数 が pointer 引 き 数 の 数 よ り 多 か っ た 場 合 の 結 果 は 未 定 義 で あ る 。 pointer 引 き 数 の 数 が 変 換 指 定 の 個 数 よ り も 多 か っ た 場 合 、 余 分 な pointer 引 き 数 の 評 価 は 行 わ れ る が 、 そ れ 以 外 は 行 わ れ ず 無 視 さ れ る 。
scanf() 関 数 は 標 準 入 力 ス ト リ ー ム stdin か ら の 入 力 を 読 み 込 む 。 fscanf() は ス ト リ ー ム ポ イ ン タ ー stream か ら の 入 力 を 読 み 込 む 。 sscanf() は 文 字 列 ポ イ ン タ ー str で 示 さ れ た 文 字 列 か ら の 入 力 を 読 み 込 む 。
vfscanf() 関 数 は vfprintf(3) と 同 様 に 、 ス ト リ ー ム ポ イ ン タ ー stream か ら の 入 力 を ポ イ ン タ ー の 可 変 長 引 き 数 リ ス ト を 用 い て 読 み 込 む (stdarg(3) を 参 照 )。 vscanf() 関 数 は 、 可 変 長 引 き 数 の リ ス ト に 基 づ き 標 準 入 力 か ら の 読 み 取 り を 行 う 。 vsscanf() 関 数 は そ の リ ス ト に 基 づ き 文 字 列 か ら 読 み 取 る 。 こ れ ら の 関 係 は vprintf(3) と vsprintf(3) 関 数 の 関 係 と 同 様 で あ る 。
format 文 字 列 は 「 命 令 」 (directive) の 列 で 構 成 さ れ る 。 命 令 は 入 力 文 字 の 系 列 を ど の よ う に 処 理 す る か を 指 示 す る も の で あ る 。 あ る 命 令 の 処 理 が 失 敗 す る と 、 入 力 は そ れ 以 上 読 み 込 ま れ ず 、 scanf() は 返 る 。 「 失 敗 」 は 「 入 力 の 失 敗 」 (input failure) と 「 一 致 の 失 敗 」 (matching failure) の い ず れ か で あ る 。 入 力 の 失 敗 は 入 力 文 字 が 使 用 で き な か っ た こ と を 意 味 し 、 一 致 の 失 敗 は 入 力 が 不 適 切 で あ っ た こ と (下 記 参 照 ) を 意 味 す る 。 命 令 は 以 下 の い ず れ か で あ る :
• ホ ワ イ ト ス ペ ー ス
(ス ペ ー ス 、 タ ブ 、 改 行 な ど ; isspace(3) 参 照 ) の
列 。 こ の 命 令 は 、 入 力 中 の 任 意 の 個 数 の ホ ワ イ ト ス ペ ー ス に 一 致 す る 。 (「 何 も な し 」 に も 一 致 す る )。
• 通 常 文 字
(つ ま り 、 ホ ワ イ ト ス ペ ー ス と '%' 以 外 の 文 字 )。 こ の 文 字
は 入 力 の 次 の 文 字 に 正 確 に 一 致 し な け れ ば な ら な い 。
• 変 換 指 定 。 変 換 指 定 は
'%' (パ ー セ ン ト ) 文 字 で 始 ま る 。 入 力 さ れ た
文 字 の 系 列 は こ の 指 定 に も と づ い て 変 換 さ れ 、 変 換 結 果 は 対 応 す る pointer 引 き 数 が 指 す 場 所 に 格 納 さ れ る 。 入 力 の 次 の 文 字 が 変 換 指 定 と 一 致 し な い 場 合 は 、 変 換 は 失 敗 す る —こ れ が 「 一 致 の 失 敗 」 (matching failure) で あ る 。
format 中 の 各 々 の 「 変 換 指 定 」 は 文 字 '%' か 文 字 系 列 "%n$" (違 い に つ い て は 後 述 ) で 始 ま り 、 以 下 の 要 素 が 続 く 。
• 代 入 抑 制 文 字
'*' (省 略 可 能 )。 scanf() は 変 換 指 定 に 指 示 さ れ た 通
り 入 力 を 読 み 込 む が 、 そ の 入 力 は 捨 て ら れ る 。 対 応 す る pointer 引 き 数 は 必 要 な く 、 scanf() が 返 す 代 入 が 成 功 し た 数 に こ の 指 定 は 含 ま れ な い 。
• 文 字
'm' (省 略 可 能 )。 こ れ は 文 字 列 変 換 (%s, %c, %[) と と も に 使 用
さ れ 、 こ れ を 使 う と 呼 び 出 し 元 が 入 力 を 保 持 す る 対 応 す る バ ッ フ ァ ー を 確 保 す る 必 要 が な く な る 。 代 わ り に scanf() が 必 要 な 大 き さ の バ ッ フ ァ ー を 確 保 し 、 こ の バ ッ フ ァ ー の ア ド レ ス を 対 応 す る pointer 引 き 数 に 代 入 す る 。 pointer 引 き 数 は char * 型 の 変 数 へ の ポ イ ン タ ー で な け れ ば な ら な い (変 数 自 体 は 呼 び 出 し 前 に 初 期 化 さ れ て い る 必 要 は な い )。 呼 び 出 し 元 は 、 不 要 に な っ た 時 点 で 、 こ の バ ッ フ ァ ー を free(3) す べ き で あ る 。
• 「 最 大 フ ィ ー ル ド 幅 」 を 指 定 す る
10進 数 (省 略 可 能 )。 こ の 最 大 値 に
達 す る か 、 一 致 し な い 文 字 が 見 つ か る か 、 の ど ち ら か に な る と 、 文 字 の 読 み 込 み を 停 止 す る 。 ほ と ん ど の 変 換 で は 、 先 頭 の ホ ワ イ ト ス ペ ー ス 文 字 は 捨 て ら れ (例 外 に つ い て は 後 述 す る )、 捨 て ら れ た こ れ ら の 文 字 は 最 大 フ ィ ー ル ド 幅 の 計 算 に は 含 ま れ な い 。 文 字 列 の 入 力 変 換 で は 、 入 力 の 末 尾 を 示 す 終 端 の ヌ ル バ イ ト ('0円') も 格 納 さ れ る が 、 最 大 フ ィ ー ル ド 幅 に は こ の 終 端 バ イ ト は 含 ま れ な い 。
• 「 型 修 飾 子 」
(type modifier characters) (省 略 可 能 )。 例 え ば 、 型
修 飾 子 l を %d な ど の 整 数 変 換 と 一 緒 に 使 う と 、 対 応 す る pointer 引 き 数 が int で は な く long int を 参 照 し て い る こ と を 指 定 で き る 。
• 「 変 換 指 定 」 : 実 行 す べ き 入 力 変 換 の 種 類 を 指 定 す る 。
format 中 の 変 換 指 定 は 、 '%' で 始 ま る か 、 "%n$" で 始 ま る か の 、 い ず れ か の 形 式 で あ る 。 こ れ ら 2つ の 形 式 を 同 じ format 文 字 列 に 混 ぜ る こ と は で き な い 。 但 し 、 "%n$" を 含 む 文 字 列 に %% と %* を 含 め る こ と は で き る 。 format に '%' 指 定 が 含 ま れ て い る 場 合 、 各 々 の '%' 指 定 と 後 続 の pointer 引 き 数 は そ の 順 番 通 り に 対 応 す る 。 "%n$" 形 式 (POSIX.1−2001 で は 規 定 さ れ て い る が 、 C99 に は な い ) で は 、 n は 10進 数 で あ り 、 変 換 後 の 入 力 を format の 後 ろ の n 番 目 の pointer 引 き 数 が 参 照 す る 場 所 に 格 納 す る こ と を 指 定 す る 。 変 換 変 換 指 定 に は 、 以 下 の 「 型 修 飾 子 」 を 入 れ る こ と が で き る 。
h 変 換 が
d, i, o, u, x, X, n の い ず れ か で あ り 、 次 の ポ イ ン タ ー が
(int で は な く ) short int か unsigned short int へ の ポ イ ン タ ー で あ る こ と を 示 す 。
hh
h と 同 じ だ が 、 次 の ポ イ ン タ ー が signed char か unsigned char へ の ポ イ ン タ ー で あ る こ と を 示 す 。
j
h と 同 じ だ が 、 次 の ポ イ ン タ ー が intmax_t か uintmax_t へ の ポ イ ン タ ー で あ る こ と を 示 す 。 こ の 修 飾 子 は C99 で 導 入 さ れ た 。
l
変 換 が
d, i, o, u, x, X,
n か n の い ず
れ か で あ り 次
の ポ イ ン タ ー
が (int で は な く )
long int か unsigned long int へ
の ポ イ ン タ ー
で あ る こ と 、
ま た は 、 変 換
が e, f, g の う
ち の ひ と つ で
あ り 次 の ポ イ
ン タ ー が (float で
は な く ) double へ の
ポ イ ン タ ー で
あ る こ と の い
ず れ か で あ る
こ と を 示 す 。
l 文 字 を 二 つ
指 定 す る と 、
L と 同 じ 意 味
と な る 。 %c や
%s と と も に 使
用 す る と 、 パ
ラ メ ー タ ー は
そ れ ぞ れ ワ イ
ド 文 字 や ワ イ
ド 文 字 列 へ の
ポ イ ン タ ー で
あ る と み な さ
れ る 。
L
e, f, g 変 換 で 、 次 の ポ イ ン タ ー が long double へ の ポ イ ン タ ー で あ る こ と を 示 す 。 も し く は 、 d, i, o, u, x 変 換 で 、 次 の ポ イ ン タ ー が long long へ の ポ イ ン タ ー で あ る こ と の い ず れ か で あ る こ と を 示 す 。
q
L と 同 一 で あ る 。 こ の 修 飾 子 は ANSI C に は 存 在 し な い 。
t
h と 同 様 だ が 、 次 の ポ イ ン タ ー が ptrdiff_t へ の ポ イ ン タ ー で あ る こ と を 示 す 。 こ の 修 飾 子 は C99 で 導 入 さ れ た 。
z
h と 同 様 だ が 、 次 の ポ イ ン タ ー が size_t へ の ポ イ ン タ ー で あ る こ と を 示 す 。 こ の 修 飾 子 は C99 で 導 入 さ れ た 。
以 下 の 「 変 換 指 定 子 」 が 利 用 可 能 で あ る 。
% 文 字
'%' に 対 応 す る 。 書 式 文 字 列 の 中 の %% は 単 一 の 文 字 '%' に 対
応 す る 。 変 換 は 行 わ れ ず (但 し 、 先 頭 の ホ ワ イ ト ス ペ ー ス 文 字 は 捨 て ら れ る )、 変 数 へ の 代 入 は 生 じ な い 。
d 符 号 つ き の
10進 の 整 数 に 対 応 す る 。 次 の ポ イ ン タ ー は int へ の ポ イ
ン タ ー で な け れ ば な ら な い 。
D
ld と 同 一 で あ る 。 こ れ は 以 前 の 仕 様 と の 互 換 性 だ け の た め に あ る 。 (注 意 : こ れ は libc4 の 場 合 だ け で あ る 。 libc5 や glibc で は %D は 暗 黙 の う ち に 無 視 さ れ 、 古 い プ ロ グ ラ ム に お い て 謎 に 満 ち た 失 敗 の 原 因 と な る 。 )
i
符 号 つ き 整 数 に 対 応 す る 。 次 の ポ イ ン タ ー は int へ の ポ イ ン タ ー で な け れ ば な ら な い 。 こ の 整 数 は 0x ま た は 0X で 開 始 す る 場 合 に は 16 進 数 、 0 で 開 始 す る 場 合 に は 8 進 数 、 そ の 他 の 場 合 に は 10進 数 と し て 読 み 込 ま れ る 。 こ の 変 換 で 使 用 さ れ る 文 字 は 、 こ れ ら の 基 数 に 対 応 し て い る も の だ け で あ る 。
o
符 号 な し の 8 進 の 整 数 に 対 応 す る 。 次 の ポ イ ン タ ー は unsigned int で な け れ ば な ら な い 。
u
符 号 な し の 10進 の 整 数 に 対 応 す る 。 次 の ポ イ ン タ ー は unsigned int へ の ポ イ ン タ ー で な け れ ば な ら な い 。
x
符 号 な
し の 16 進 の 整 数
に 対 応 す る 。
次 の ポ イ ン タ
ー は unsigned int へ の
ポ イ ン タ ー で
な け れ ば な ら
な い 。
X
x と 同 一 で あ る 。
f
符 号 つ
き 浮 動 小 数 点
実 数 に 対 応 す
る 。 次 の ポ イ
ン タ ー は float へ
の ポ イ ン タ ー
で な け れ ば な
ら な い 。
e
f と 同 一 で あ る 。
g
f と 同 一 で あ る 。
E
f と 同 一 で あ る 。
a
(C99) f と 同 一 で あ る 。
s
ホ ワ イ ト ス ペ ー ス で は な い 文 字 で 構 成 さ れ た 文 字 列 に 対 応 す る 。 次 の ポ イ ン タ ー は 文 字 の 配 列 へ の ポ イ ン タ ー で な け れ ば な ら ず 、 そ の 文 字 配 列 は 、 入 力 さ れ た 文 字 列 と (自 動 的 に 追 加 さ れ る ) 終 端 の ヌ ル バ イ ト ('0円') を 格 納 す る の に 十 分 な 大 き さ で な け れ ば な ら な い 。 文 字 列 の 入 力 は 、 ホ ワ イ ト ス ペ ー ス が 入 力 さ れ る か 、 最 大 フ ィ ー ル ド 幅 に 達 す る か 、 の ど ち ら か が 起 こ る と 停 止 さ れ る 。
c
「 最 大 フ ィ ー ル ド 幅 」 (デ フ ォ ル ト は 1) で 指 定 さ れ た 幅 の 文 字 の 列 に 対 応 す る 。 次 の ポ イ ン タ ー は char へ の ポ イ ン タ ー で 、 す べ て の 文 字 を 格 納 す る の に 十 分 な 領 域 が な け れ ば な ら な い (終 端 の ヌ ル バ イ ト は 追 加 さ れ な い )。 通 常 行 わ れ る 先 頭 の ホ ワ イ ト ス ペ ー ス の 読 み 飛 ば し は 行 わ れ な い 。 先 頭 の ホ ワ イ ト ス ペ ー ス を 読 み 飛 ば す た め に は 、 フ ォ ー マ ッ ト 文 の 中 で 明 示 的 に ス ペ ー ス を 使 用 す れ ば 良 い 。
[
格 納 さ
れ た 文 字 列 の
う ち か ら 取 り
出 さ れ た 、 指
定 さ れ た 文 字
の 集 合 で 構 成
さ れ る 空 で は
な い 文 字 の 列
に 対 応 す る 。
次 の ポ イ ン タ
ー は char へ の ポ
イ ン タ ー で な
け れ ば な ら ず
、 そ こ に は 文
字 列 中 の す べ
て の 文 字 と 終
端 の ヌ ル バ イ
ト を 格 納 す る
た め の 十 分 な
領 域 が な け れ
ば な ら な い 。
通 常 行 わ れ る
先 頭 の ホ ワ イ
ト ス ペ ー ス の
読 み 飛 ば し は
行 わ れ な い 。
こ の 文 字 列 は
特 別 な 集 合 の
中 の 文 字 で 構
成 さ れ て い る
。 こ の 集 合 は
開 き 括 弧 [ と
閉 じ 括 弧 ] の
間 の 文 字 で 定
義 さ れ る 。 開
き 括 弧 の あ と
の 最 初 の 文 字
が 曲 ア ク セ ン
ト 記 号 (^) の 場
合 、 集 合 は こ
れ ら の 文 字 を
含 ま な い も の
と な る 。 閉 じ
括 弧 を 集 合 に
含 ま せ る た め
に は 、 こ の 文
字 を 開 き 括 弧
ま た は 曲 ア ク
セ ン ト 記 号 の
あ と の 最 初 の
文 字 に す れ ば
よ い 。 つ ま り
、 他 の 位 置 に
閉 じ 括 弧 を 置
く と 文 字 の 集
合 が 終 る 。 ハ
イ フ ン − も ま
た 特 殊 文 字 で
あ る 。 二 つ の
異 な る 文 字 の
間 に 置 か れ た
時 、 こ の 文 字
は 、 そ の 間 に
あ る 全 て の 文
字 を 集 合 に 加
え る 。 ハ イ フ
ン 自 体 を 含 ま
せ る た め に は
、 括 弧 が 閉 じ
る 前 の 最 後 の
一 文 字 を ハ イ
フ ン に す れ ば
よ い 。 例 え ば
、 [^]0−9−] は 「
閉 じ 括 弧 、 0 〜
9、 ハ イ フ ン の 3
種 類 を 除 く 全
て の 文 字 」 の
集 合 を 意 味 す
る 。 こ の 文 字
列 は 集 合 に 含
ま れ て い な い
(曲 ア ク セ ン ト
の 場 合 に は 含
ま れ る ) 文 字 の
出 現 ま た は 確
保 さ れ た 領 域
が 使 い 切 ら れ
た 時 に 終 了 す
る 。
p
(printf(3) の %p で 印 字 さ れ る よ う な ) ポ イ ン タ ー 値 に 対 応 す る 。 次 の ポ イ ン タ ー は void へ の ポ イ ン タ ー へ の ポ イ ン タ ー で な け れ ば な ら な い 。
n
ど ん な 入 力 も 必 要 と し な い 。 そ の か わ り に 、 入 力 か ら こ こ ま で 消 費 さ れ た 文 字 数 が 次 の ポ イ ン タ ー で 指 定 さ れ た 場 所 に 格 納 さ れ る 。 こ の ポ イ ン タ ー は int へ の ポ イ ン タ ー で な け れ ば な ら な い 。 変 換 を 抑 制 す る の で あ れ ば * 代 入 抑 制 文 字 を 使 っ て 抑 制 す る こ と が で き る の だ が 、 こ の 変 換 指 定 子 は 変 換 で は 「 な い 」 。 C 言 語 の 標 準 規 格 で は 「 実 行 の 完 了 時 に 返 さ れ る 代 入 の 回 数 は %n 命 令 の 実 行 で は 増 加 し な い 」 と な っ て い る が 、 正 誤 表 の 内 容 は こ れ と 矛 盾 す る よ う で あ る 。 お そ ら く 、 %n 変 換 が 返 り 値 に 与 え る 影 響 に つ い て は ど の よ う な 仮 定 も し な い の が 賢 明 で あ ろ う 。
返 り 値
こ れ ら の 関 数 は 、 一 致 と 代 入 が 成 功 し た 入 力 要 素 の 個 数 を 返 す 。 返 さ れ る 値 は 渡 さ れ た 変 換 の 個 数 よ り も 少 な い こ と も あ り 、 最 初 に 一 致 の 失 敗 が あ っ た 場 合 に は 0 に な る こ と も あ る 。 最 初 の 変 換 が 成 功 す る 前 に 入 力 の 最 後 に 達 し て 、 一 致 の 失 敗 が 起 こ っ た 場 合 に は 、 EOF が 返 さ れ る 。 ま た 、 読 み 込 み エ ラ ー が 発 生 し た 場 合 に も EOF が 返 さ れ る 。 読 み 込 み エ ラ ー の 場 合 に は 、 そ の ス ト リ ー ム の エ ラ ー 指 示 子 が セ ッ ト さ れ (ferror(3) 参 照 )、 errno に エ ラ ー を 示 す 値 が セ ッ ト さ れ る 。
エ ラ ー
EAGAIN
stream に 対 応 す る フ ァ イ ル デ ィ ス ク リ プ タ ー が nonblocking と な っ て お り 、 読 み 込 み 操 作 は 停 止 (block) す る こ と に な る 。
EBADF
stream に 対 応 す る フ ァ イ ル デ ィ ス ク リ プ タ ー が 無 効 で あ る が 、 読 み 込 み 用 に オ ー プ ン さ れ て い な い 。
EILSEQ
入 力 さ れ た バ イ ト 列 が 有 効 な 文 字 を 構 成 し て い な い 。
EINTR 読 み 込 み 操 作 が シ グ ナ ル に よ り 割 り 込 ま れ た 。
signal(7) 参 照 。
EINVAL 引 き 数 が 十 分 で な い 。 ま た は
format が NULL で あ る 。
ENOMEM メ モ リ ー 不 足 。
ERANGE 整 数 変 換 の 結 果 が 、 対 応 す る 整 数 型 に 格 納 で き る サ イ ズ を 越 え て し ま う 。
準 拠
fscanf(), scanf(), sscanf() 関 数 は C89, C99, POSIX.1−2001 に 準 拠 し て い る 。 こ れ ら の 標 準 で は 、 エ ラ ー ERANGE は 規 定 さ れ て い な い 。
q 指 定 子 は long long の 4.4BSD で の 記 述 方 法 で あ る 。 一 方 、 整 数 変 換 で の ll ま た は L の 使 用 は GNU で の 拡 張 で あ る 。 こ れ ら の 関 数 の Linux 版 は GNU libio ラ イ ブ ラ リ ー を 元 に し て い る 。 よ り 簡 潔 な 説 明 に は GNU libc (glibc−1.08) の info 文 書 に 目 を 通 す こ と 。
注 意
’a’ 代 入 割 り 当 て (assignment−allocation) 修 飾 子 元 々 、 GNU C ラ イ ブ ラ リ (glibc) で は 、 a 文 字 に よ る 文 字 列 入 力 に 対 す る 動 的 割 り 当 て 変 換 指 定 子 (dynamic allocation conversion specifier) を (非 標 準 の 拡 張 と し て ) サ ポ ー ト し て い る 。 こ の 機 能 は 少 な く と も glibc 2.0 の 時 点 で は す で に 存 在 し て い る 。 し た が っ て 、 以 下 の よ う に し て 、 scanf() に 入 力 文 字 列 に 対 し て バ ッ フ ァ ー を 割 り 当 て さ せ る こ と が で き る 。 割 り 当 て ら れ た バ ッ フ ァ ー は *buf で 返 さ れ る 。
char *buf;
scanf("%as", &buf); こ の 目
的 で 文 字 a を
使 う の は 問 題
を は ら ん で い
る 。 な ぜ な ら
、 a は ISO C 標 準 で
は (浮 動 小 数 点
入 力 を 表 す ) の
f の 同 義 語 と
し て 定 義 さ れ
て い る か ら で
あ る 。 そ の 代
わ り 、 POSIX.1−2008 で
は 、 (上 記 の 「
説 明 」 に 書 か
れ て い る 通 り )
代 入 割 り 当 て
を 行 う 修 飾 子
と し て m が 規
定 さ れ て い る
。
a 修 飾 子 は gcc −std=c99 や gcc −D_ISOC99_SOURCE で コ ン パ イ ル し た プ ロ グ ラ ム で は (_GNU_SOURCE も 同 時 に 指 定 し て い な い 場 合 ) 利 用 で き な い 点 に 注 意 。 こ の 場 合 、 a は (上 述 の 通 り ) 浮 動 小 数 点 数 を 示 す 変 換 指 定 子 と 解 釈 さ れ る 。
m 修 飾 子 へ の 対 応 は バ ー ジ ョ ン 2.7 以 降 の glibc で 追 加 さ れ て い る 。 新 し い プ ロ グ ラ ム で ぇ あ a の 代 わ り に m を 使 用 す べ き で あ る 。
POSIX で 標 準 化 さ れ て い る だ け で な く 、 m 修 飾 子 に は a を 利 用 す る 場 合 に 比 べ て 以 下 の よ う な 利 点 が あ る 。
*
%c 変 換 指 定 子 に も 適 用 で き る (例 え ば %3mc)。
*
浮 動 小 数 点 変 換 指 定 子 と し て の %a と の 紛 ら わ し さ が 避 け ら れ る (ま た gcc −std=c99 な ど の 影 響 も 避 け ら れ る )。
バ グ
全 て の 関 数 は 、 完 全 に C89 に 準 拠 し て い る 。 し か し 追 加 で q と a 指 定 子 が 提 供 さ れ て お り 、 同 様 に L と l 指 定 子 の 付 加 的 な 振 る 舞 い も あ る 。 後 者 は 、 C89 で 定 義 さ れ た 指 定 子 の 振 る 舞 い を 変 更 す る も の な の で 、 バ グ と み な さ れ る か も し れ な い 。
ANSI C で 定 義 さ れ た 型 修 飾 子 と 変 換 指 定 子 の 組 み 合 わ せ の 中 に は 意 味 を な さ な い も の が あ る (例 え ば 、 %Ld)。 こ れ ら が 指 定 さ れ た 場 合 、 Linux 上 で は は っ き り と 定 義 さ れ た 振 る 舞 い を す る か も し れ な い が 、 他 の ア ー キ テ ク チ ャ ー で も 同 様 に な っ て い る と は 限 ら な い 。 そ れ ゆ え に 、 ほ と ん ど の 場 合 、 ANSI C で 定 義 さ れ て い な い 修 飾 子 を 使 用 し た 方 が 良 い 。 す な わ ち 、 d, i, o, u, x, X 変 換 や ll と 組 み 合 わ せ る 場 合 に は 、 L の 代 わ り に q を 使 用 し た 方 が 良 い 。
q の 使 用 方 法 は 4.4BSD と 同 じ で は な い 。 4.4BSD で は q は L と 同 等 に 浮 動 小 数 の 変 換 に 使 用 さ れ る 。
例
動 的 割 り 当 て 変 換 指 定 子 を 使 用 す る に は 、 長 さ 修 飾 子 と し て m を 指 定 す る (つ ま り 、 全 体 と し て は %ms や %m[range] と な る )。 以 下 の 例 に あ る よ う に 、 呼 び 出 し 側 は 返 さ れ た 文 字 列 を free(3) し な け れ ば な ら な い 。
char *p;
int n;
errno = 0;
n = scanf("%m[a−z]", &p);
if (n == 1) {
printf("read: %s\n", p);
free(p); }
else if (errno != 0) {
perror("scanf"); }
else {
fprintf(stderr, "No matching characters\n"); }
上 記 の 例 に あ
る よ う に 、 scanf()
が 文 字 列 の 読
み 込 み に 成 功
し た 場 合 に だ
け 、 free(3) を 呼 び
出 す 必 要 が あ
る 。
関 連 項 目
getc(3), printf(3) setlocale(3), strtod(3), strtol(3), strtoul(3),
こ の 文 書 に つ い て
こ の man ペ ー ジ は Linux man−pages プ ロ ジ ェ ク ト の リ リ ー ス 3.79 の 一 部 で あ る 。 プ ロ ジ ェ ク ト の 説 明 と バ グ 報 告 に 関 す る 情 報 は http://www.kernel.org/doc/man−pages/ に 書 か れ て い る 。