Manpages

名 前

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 intunsigned short int へ の ポ イ ン タ ー で あ る こ と を 示 す 。

hh

h と 同 じ だ が 、 次 の ポ イ ン タ ー が signed charunsigned char へ の ポ イ ン タ ー で あ る こ と を 示 す 。

j

h と 同 じ だ が 、 次 の ポ イ ン タ ー が intmax_tuintmax_t へ の ポ イ ン タ ー で あ る こ と を 示 す 。 こ の 修 飾 子 は C99 で 導 入 さ れ た 。

l

変 換 が d, i, o, u, x, X, nn の い ず れ か で あ り 次 の ポ イ ン タ ー が (int で は な く ) long intunsigned 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=c99gcc −D_ISOC99_SOURCE で コ ン パ イ ル し た プ ロ グ ラ ム で は (_GNU_SOURCE も 同 時 に 指 定 し て い な い 場 合 ) 利 用 で き な い 点 に 注 意 。 こ の 場 合 、 a は (上 述 の 通 り ) 浮 動 小 数 点 数 を 示 す 変 換 指 定 子 と 解 釈 さ れ る 。

m 修 飾 子 へ の 対 応 は バ ー ジ ョ ン 2.7 以 降 の glibc で 追 加 さ れ て い る 。 新 し い プ ロ グ ラ ム で ぇ あ a の 代 わ り に m を 使 用 す べ き で あ る 。

POSIX で 標 準 化 さ れ て い る だ け で な く 、 m 修 飾 子 に は a を 利 用 す る 場 合 に 比 べ て 以 下 の よ う な 利 点 が あ る 。

*

%c 変 換 指 定 子 に も 適 用 で き る (例 え ば %3mc)。

*

浮 動 小 数 点 変 換 指 定 子 と し て の %a と の 紛 ら わ し さ が 避 け ら れ る (ま た gcc −std=c99 な ど の 影 響 も 避 け ら れ る )。

バ グ

全 て の 関 数 は 、 完 全 に C89 に 準 拠 し て い る 。 し か し 追 加 で qa 指 定 子 が 提 供 さ れ て お り 、 同 様 に Ll 指 定 子 の 付 加 的 な 振 る 舞 い も あ る 。 後 者 は 、 C89 で 定 義 さ れ た 指 定 子 の 振 る 舞 い を 変 更 す る も の な の で 、 バ グ と み な さ れ る か も し れ な い 。

ANSI C で 定 義 さ れ た 型 修 飾 子 と 変 換 指 定 子 の 組 み 合 わ せ の 中 に は 意 味 を な さ な い も の が あ る (例 え ば 、 %Ld)。 こ れ ら が 指 定 さ れ た 場 合 、 Linux 上 で は は っ き り と 定 義 さ れ た 振 る 舞 い を す る か も し れ な い が 、 他 の ア ー キ テ ク チ ャ ー で も 同 様 に な っ て い る と は 限 ら な い 。 そ れ ゆ え に 、 ほ と ん ど の 場 合 、 ANSI C で 定 義 さ れ て い な い 修 飾 子 を 使 用 し た 方 が 良 い 。 す な わ ち 、 d, i, o, u, x, X 変 換 や ll と 組 み 合 わ せ る 場 合 に は 、 L の 代 わ り に q を 使 用 し た 方 が 良 い 。

q の 使 用 方 法 は 4.4BSD と 同 じ で は な い 。 4.4BSD で は qL と 同 等 に 浮 動 小 数 の 変 換 に 使 用 さ れ る 。

動 的 割 り 当 て 変 換 指 定 子 を 使 用 す る に は 、 長 さ 修 飾 子 と し て 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/ に 書 か れ て い る 。