開発環境 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