「C言語/C++/scanf」の編集履歴(バックアップ)一覧はこちら
C言語/C++/scanf - (2012/09/02 (日) 19:01:40) の1つ前との変更点
追加された行は緑色になります。
削除された行は赤色になります。
|開発環境|Microsoft Visual C++ 2010 Express (SP1)|
|実行環境|Microsoft Windows XP Home Edition (SP3)|
|プロジェクトの種類|Win32 コンソール アプリケーション|
|プロジェクト名|scanf|
|アプリケーションの種類|コンソール アプリケーション|
|追加のオプション|空のプロジェクト|
-scanf()の戻り値(正常に変換され、代入されたフィールドの数)はなるべくチェックする。
-Ctrl+Zが入力された場合の戻り値はEOF。
-必要であればrewind(stdin)でキーボードバッファをクリアする。
-文字列を入力する場合、最大文字数を指定するようにする。バッファにはNULL文字用の領域も確保しておく。
----
scanf1.c
#highlight(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
#highlight(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
#highlight(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
#highlight(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("%76ls"), 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
|開発環境|Microsoft Visual C++ 2010 Express (SP1)|
|実行環境|Microsoft Windows XP Home Edition (SP3)|
|プロジェクトの種類|Win32 コンソール アプリケーション|
|プロジェクト名|scanf|
|アプリケーションの種類|コンソール アプリケーション|
|追加のオプション|空のプロジェクト|
-scanf()の戻り値(正常に変換され、代入されたフィールドの数)はなるべくチェックする。
-Ctrl+Zが入力された場合の戻り値はEOF。
-必要であればrewind(stdin)でキーボードバッファをクリアする。
-文字列を入力する場合、最大文字数を指定するようにする。バッファにはNULL文字用の領域も確保しておく。
----
scanf1.c
#highlight(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
#highlight(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
#highlight(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
#highlight(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