開発環境 |
Microsoft Visual C++ 2010 Express (SP1) |
実行環境 |
Microsoft Windows XP Home Edition (SP3) |
プロジェクトの種類 |
Win32 コンソール アプリケーション |
プロジェクト名 |
input |
アプリケーションの種類 |
コンソール アプリケーション |
追加のオプション |
空のプロジェクト |
input1.c
#include <ctype.h>
#include <stdio.h>
int main()
{
int i;
while (1) {
i = getchar();
if (i == EOF) break;
printf("%02x %c\n", i, isprint(i) ? i : '?');
}
return 0;
}
出力
a[Enter]
61 a
0a ?
あ[Enter]
82 ?
a0 ?
0a ?
^Z[Enter]
input2.c
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
int main()
{
char buf[10+1];
char *p;
while (1) {
printf("(Ctrl-Zで終了)>");
p = fgets(buf, _countof(buf), stdin);
if (p == NULL) break;
printf("[%s]\n", buf);
}
return 0;
}
出力
(Ctrl-Zで終了)>aaa bbb ccc[Enter]
[aaa bbb cc]
(Ctrl-Zで終了)>[c
]
(Ctrl-Zで終了)>[Enter]
[
]
(Ctrl-Zで終了)>^Z[Enter]
考察
- 残りの文字列が入力ストリーム上に残ってしまう
- 改行文字も格納される
input3.c
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main()
{
char buf[10+1];
int i;
while (1) {
printf("(Ctrl-Zで終了)>");
i = scanf("%10[^\n]%*[^\n]", buf);
if (i == EOF) break;
getchar();
if (i != 1) continue;
printf("[%s]\n", buf);
}
return 0;
}
出力
(Ctrl-Zで終了)>aaa bbb ccc[Enter]
[aaa bbb cc]
(Ctrl-Zで終了)>[Enter]
(Ctrl-Zで終了)>^Z[Enter]
input4.c
// Unicode 文字セット
#include <locale.h> // LC_CTYPE
#include <stdio.h> // EOF
#include <stdlib.h> // _countof()
#include <tchar.h>
int main()
{
_TCHAR buf[10+1];
int i;
_tsetlocale(LC_CTYPE, _T(""));
while (1) {
_tprintf(_T("(Ctrl-Zで終了)>"));
i = _tscanf_s(_T("%10[^\n]%*[^\n]"), buf, _countof(buf));
if (i == EOF) break;
_gettchar();
if (i != 1) continue;
_tprintf(_T("[%s]\n"), buf);
}
return 0;
}
出力
(Ctrl-Zで終了)>aaa bbb ccc[Enter]
[aaa bbb cc]
(Ctrl-Zで終了)>あああ いいい ううう[Enter]
[あああ いいい うう]
(Ctrl-Zで終了)>[Enter]
(Ctrl-Zで終了)>^Z[Enter]
最終更新:2012年09月04日 15:03