「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

表示オプション

横に並べて表示:
変化行の前後のみ表示: