curs_scanw(3x) curs_scanw(3x)
scanw, wscanw, mvscanw, mvwscanw, vwscanw, vw_scanw
- curses ウインドウからの書式つき入力の変換
#include <curses.h>
int scanw(char *fmt, ...);
int wscanw(WINDOW *win, char *fmt, ...);
int mvscanw(int y, int x, char *fmt, ...);
int mvwscanw(WINDOW *win, int y, int x, char *fmt, ...);
int vw_scanw(WINDOW *win, char *fmt, va_list varglist);
int vwscanw(WINDOW *win, char *fmt, va_list varglist);
scanw, wscanw, mvscanw ルーチンは scanf に類似した
ルーチンです。[scanf(3) 参照]
実際には、これらのルーチンは、そのウインドウで wgetstr が
呼び出され、結果の行を sscanf(3) の入力に用いたように
なります。
fmt フィールドで変数に対応付けられていないフィールドは
失われます。
vwscanw, vw_scanw ルーチンは vscanf に類似したルーチンです。
これらは可変引数リストを使って wscanw を実行します。
第 3 引数は引数リストへのポインタで、<stdarg.h> で
定義されている va_list 型です。
vwscanw は失敗のとき ERR を、成功のとき読み取った
フィールドの数に等しい整数を返します。
アプリケーションは呼び出しで代入されたフィールドの数を
判定するために scanw, wscanw, mvscanw, mvwscanw ルーチンの
戻り値を使うことができます。
mv で始まる関数は、最初に wmove を使用してカーソルを移動し、
位置がウインドウの外だった場合、またはウインドウ・ポインタが
ヌルの場合にエラーを返します。
これらの関数は XSI Curses standard, Issue 4 に記載されて
います。
vwscanw 関数は廃止項目と注記されており、
<stdarg.h> インターフェイスを使った vw_scanw 関数によって
置き換えられるでしょう。
Single Unix Specification, Version 2 は、<stdarg.h> と
同じファイルで使うことができない <varargs.h> を取り込む必要が
ある vwscanw よりも vw_scanw が適していると明記しています。
この実装では両方に <stdarg.h> を使っています。
このヘッダファイルが <curses.h> で取り込まれるためです。
XSI と Single Unix Specification, Version 2 はともに、
これらの関数は ERR または OK を返すと明記しています。
元となった scanf は代入した項目の数を返せますし、
SVr4 のコードはこの機能を使うと説明されているので、
これはおそらく XSI に導入された編集上の誤りであって、
意図的なものではないでしょう。
ポータブル・アプリケーションは戻り値が ERR かどうかだけを
調べるべきです。OK 値 (ゼロ) は誤解を招きそうだからです。
意味のある結果を得るためにできる 1 つの手段は、
書式文字列の最後に "%n" 変換を使って、何かが処理されたことを
確かめることでしょう。
curses(3x), curs_getstr(3x), curs_printw(3x), scanf(3)
curs_scanw(3x)