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
で 導 入 さ れ た
。
変 換 が
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 は 暗 黙
の う ち に 無 視
さ れ 、 古 い プ
ロ グ ラ ム に お
い て 謎 に 満 ち
た 失 敗 の 原 因
と な る 。 )
符 号 つ
き 整 数 に 対 応
す る 。 次 の ポ
イ ン タ ー は int
へ の ポ イ ン タ
ー で な け れ ば
な ら な い 。 こ
の 整 数 は 0x ま
た は 0X で 開 始
す る 場 合 に は 16
進 数 、 0 で 開
始 す る 場 合 に
は 8 進 数 、 そ の
他 の 場 合 に は
10進 数 と し て 読
み 込 ま れ る 。
こ の 変 換 で 使
用 さ れ る 文 字
は 、 こ れ ら の
基 数 に 対 応 し
て い る も の だ
け で あ る 。
符 号 な
し の 8 進 の 整 数
に 対 応 す る 。
次 の ポ イ ン タ
ー は unsigned int で な
け れ ば な ら な
い 。
符 号 な
し の 10進 の 整 数
に 対 応 す る 。
次 の ポ イ ン タ
ー は unsigned int へ の
ポ イ ン タ ー で
な け れ ば な ら
な い 。
符 号 な
し の 16 進 の 整 数
に 対 応 す る 。
次 の ポ イ ン タ
ー は unsigned int へ の
ポ イ ン タ ー で
な け れ ば な ら
な い 。
X
x
と 同 一 で あ る
。
符 号 つ
き 浮 動 小 数 点
実 数 に 対 応 す
る 。 次 の ポ イ
ン タ ー は float へ
の ポ イ ン タ ー
で な け れ ば な
ら な い 。
e
f
と 同 一 で あ る
。
g
f
と 同 一 で あ る
。
E
f
と 同 一 で あ る
。
a
(C99) f
と 同 一 で あ る
。
ホ ワ イ
ト ス ペ ー ス で
は な い 文 字 で
構 成 さ れ た 文
字 列 に 対 応 す
る 。 次 の ポ イ
ン タ ー は 文 字
の 配 列 へ の ポ
イ ン タ ー で な
け れ ば な ら ず
、 そ の 文 字 配
列 は 、 入 力 さ
れ た 文 字 列 と
(自 動 的 に 追 加
さ れ る ) 終 端 の
ヌ ル バ イ ト ('\0') を
格 納 す る の に
十 分 な 大 き さ
で な け れ ば な
ら な い 。 文 字
列 の 入 力 は 、
ホ ワ イ ト ス ペ
ー ス が 入 力 さ
れ る か 、 最 大
フ ィ ー ル ド 幅
に 達 す る か 、
の ど ち ら か が
起 こ る と 停 止
さ れ る 。
「 最 大
フ ィ ー ル ド 幅
」 (デ フ ォ ル ト
は 1) で 指 定 さ れ
た 幅 の 文 字 の
列 に 対 応 す る
。 次 の ポ イ ン
タ ー は char へ の
ポ イ ン タ ー で
、 す べ て の 文
字 を 格 納 す る
の に 十 分 な 領
域 が な け れ ば
な ら な い (終 端
の ヌ ル バ イ ト
は 追 加 さ れ な
い )。 通 常 行 わ
れ る 先 頭 の ホ
ワ イ ト ス ペ ー
ス の 読 み 飛 ば
し は 行 わ れ な
い 。 先 頭 の ホ
ワ イ ト ス ペ ー
ス を 読 み 飛 ば
す た め に は 、
フ ォ ー マ ッ ト
文 の 中 で 明 示
的 に ス ペ ー ス
を 使 用 す れ ば
良 い 。
格 納 さ
れ た 文 字 列 の
う ち か ら 取 り
出 さ れ た 、 指
定 さ れ た 文 字
の 集 合 で 構 成
さ れ る 空 で は
な い 文 字 の 列
に 対 応 す る 。
次 の ポ イ ン タ
ー は char へ の ポ
イ ン タ ー で な
け れ ば な ら ず
、 そ こ に は 文
字 列 中 の す べ
て の 文 字 と 終
端 の ヌ ル バ イ
ト を 格 納 す る
た め の 十 分 な
領 域 が な け れ
ば な ら な い 。
通 常 行 わ れ る
先 頭 の ホ ワ イ
ト ス ペ ー ス の
読 み 飛 ば し は
行 わ れ な い 。
こ の 文 字 列 は
特 別 な 集 合 の
中 の 文 字 で 構
成 さ れ て い る
。 こ の 集 合 は
開 き 括 弧 [ と
閉 じ 括 弧 ] の
間 の 文 字 で 定
義 さ れ る 。 開
き 括 弧 の あ と
の 最 初 の 文 字
が 曲 ア ク セ ン
ト 記 号 (^) の 場
合 、 集 合 は こ
れ ら の 文 字 を
含 ま な い も の
と な る 。 閉 じ
括 弧 を 集 合 に
含 ま せ る た め
に は 、 こ の 文
字 を 開 き 括 弧
ま た は 曲 ア ク
セ ン ト 記 号 の
あ と の 最 初 の
文 字 に す れ ば
よ い 。 つ ま り
、 他 の 位 置 に
閉 じ 括 弧 を 置
く と 文 字 の 集
合 が 終 る 。 ハ
イ フ ン − も ま
た 特 殊 文 字 で
あ る 。 二 つ の
異 な る 文 字 の
間 に 置 か れ た
時 、 こ の 文 字
は 、 そ の 間 に
あ る 全 て の 文
字 を 集 合 に 加
え る 。 ハ イ フ
ン 自 体 を 含 ま
せ る た め に は
、 括 弧 が 閉 じ
る 前 の 最 後 の
一 文 字 を ハ イ
フ ン に す れ ば
よ い 。 例 え ば
、 [^]0−9−] は 「
閉 じ 括 弧 、 0 〜
9、 ハ イ フ ン の 3
種 類 を 除 く 全
て の 文 字 」 の
集 合 を 意 味 す
る 。 こ の 文 字
列 は 集 合 に 含
ま れ て い な い
(曲 ア ク セ ン ト
の 場 合 に は 含
ま れ る ) 文 字 の
出 現 ま た は 確
保 さ れ た 領 域
が 使 い 切 ら れ
た 時 に 終 了 す
る 。
p
(printf(3)
の %p で 印 字 さ
れ る よ う な ) ポ
イ ン タ ー 値 に
対 応 す る 。 次
の ポ イ ン タ ー
は void へ の ポ イ
ン タ ー へ の ポ
イ ン タ ー で な
け れ ば な ら な
い 。
ど ん な
入 力 も 必 要 と
し な い 。 そ の
か わ り に 、 入
力 か ら こ こ ま
で 消 費 さ れ た
文 字 数 が 次 の
ポ イ ン タ ー で
指 定 さ れ た 場
所 に 格 納 さ れ
る 。 こ の ポ イ
ン タ ー は 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/ に 書
か れ て い る 。
| | |