開発環境 |
Microsoft Visual C++ 2010 Express (SP1) |
実行環境 |
Microsoft Windows XP Home Edition (SP3) |
プロジェクトの種類 |
Win32 コンソール アプリケーション |
プロジェクト名 |
scanf |
アプリケーションの種類 |
コンソール アプリケーション |
追加のオプション |
空のプロジェクト |
- scanf()の戻り値(正常に変換され、代入されたフィールドの数)はなるべくチェックする。
- Ctrl+Zが入力された場合の戻り値はEOF。
- 必要であればrewind(stdin)でキーボードバッファをクリアする。
- 文字列を入力する場合、最大文字数を指定するようにする。バッファにはNULL文字用の領域も確保しておく。
scanf1.c
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main()
{
char c;
int i;
while (1) {
i = scanf("%c", &c);
printf("%d %#x\n", i, c);
if (c == 'q') break;
}
return 0;
}
出力
a
1 0x61
1 0xa
^Z
-1 0xa
q
1 0x71
考察
- EOF(Ctrl+Z)でループから抜ける
- 改行(0xa)を無視する→rewind()
scanf2.c
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main()
{
char c;
int i;
while (1) {
i = scanf("%c", &c);
printf("%d %#x\n", i, c);
rewind(stdin);
if (i == EOF) break;
if (c == 'q') break;
}
return 0;
}
出力
a
1 0x61
^Z
-1 0xa
scanf3.c
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main()
{
char buf[3+1];
int i;
while (1) {
i = scanf("%3s", buf);
printf("%d [%s]\n", i, buf);
if (i == EOF) break;
}
return 0;
}
出力
abcde
1 [abc]
1 [de]
^Z
-1 [de]
scanf4.c
#include <locale.h> // LC_CTYPE
#include <stdio.h> // EOF
#include <stdlib.h>
#include <tchar.h>
int main()
{
_TCHAR buf[76+1];
int i;
_tsetlocale(LC_CTYPE, _T(""));
while (1) {
_tprintf(_T("(Ctrl-Zで終了)>"));
i = _tscanf_s(_T("%76s"), buf, _countof(buf));
_tprintf(_T("%d "), i);
if (i == EOF) break;
_tprintf(_T("[%s]\n"), buf);
}
return 0;
}
出力
(Ctrl-Zで終了)>abc
1 [abc]
(Ctrl-Zで終了)>あいう
1 [あいう]
(Ctrl-Zで終了)>^Z
-1
最終更新:2012年09月02日 19:01