『やさしいC』いろいろな入出力関数

C

一行の入出力をする

  さて、これまでに文字列などを入力をする場合には、scanf()関数を使ってきましたね。ただし、scanf()関数を使うと困った問題が起こる場合がもあります。次のような行動入力してみて下さい

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

int main(void)
{
	char str[100];
	printf("文字列を入力してください。\n");
	scanf("%s", str);

	printf("入力した文字列は%sです。\n", str);

	return 0;
}
出力結果:

文字列を入力してください。
This is a pen.
入力した文字列はThisです。

  scanf()関数で文字列を入力すると、空白を格納できないことがわかります。このため、空白をもつ文字列を読み込みたい場合には、別の入力用の関数を使わなければなりません。このような関数のひとつとして、標準入力から1行の入力を受け取るgets()関数があります。上記のコードを次のように訂正してみてください。

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

int main(void)
{
	char str[100];
	printf("文字列を入力してください。\n");
	gets(str);

	printf("入力した文字列は%sです。\n", str);

	return 0;
}
出力結果:

文字列を入力してください。
This is a pen.
入力した文字列はThis is a pen.です。

  今度はgets()関数を使って読み込みました。こちらでは、空白まで読み込まれているのがわかります。gets()関数は、改行(Enterキー)を入力するまでの1行をそのまま読み込む関数なのです。読み込まれた文字は、改行のところで\0がつけられている配列に格納されることになってます。
  また、gets()関数と対になった1行の出力を行う関数として、puts()関数があります。puts()関数は文字列をそのまま出力する場合に使えますので、一緒に覚えておきましょう。なお、puts()関数ではprintf()関数のように書式をつけることができません。また、\n記号がなくても最後に改行されると言う違いがありますので、注意しておきましょう。

puts("文字列を入力してください。"); // \nがなくてもここで改行されます

重要

1行入力するには、gets()関数を使う。
1行出力するには、pets()関数を使う。

1文字の入出力をする

  C言語ではさらに1行入力のかわりに、標準入出力から1文字ずつ入出力する関数もあります。これがputchar()関数とgetchar()関数です。合わせて呼び出してみることにします。

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

int main(void)
{
	int ch;
	printf("文字を続けて入力してください。\n");

	while ( ( ch=getchar()) !=EOF )
	{
		putchar(ch);
	}

	return 0;
}
出力結果:

文字を続けて入力してください。
this is a pen.
this is a pen.
Good morning
Good morning
→Ctrl+Z 終了します

  getchar()関数はこれまでにも文字を入力する際に使っています。このコードは、1文字入力しては、1文字を出力する、という処理を繰り返し行うように記述したコードです。EOFという名前のマクロで定義されている値を返されるまで、繰り返し処理を続けるようになっています。

	while ( ( ch=getchar()) !=EOF ) //chに1文字ずつ入力して...EOFであるまで繰り返します。
	{
		putchar(ch); //1文字ずつ出力します。
	}

  windows(コマンドプロンプト)ではCtrl+Zで、UNIXなどではCtrl+Dをキーボードから入力することで、EOFが返されます。そこで、これらのキーを入力したところでプログラムの実行が終了するのです。
  ただし、この1文字入出力を行うコードは、通常は1文字ずつ入出力が画面で確認できるわけではありません。ハードディスクなどに入出力を行う際には、バッファリング(buffering)と呼ばれる処理を行われています。これは、文字を1文字ずつ入出力せずに、まとめて入出力をするする機能のことをいいます。ハードディスクにデータを入出力する処理は、時間がかかります。このため、改行を入力したときに、バッファリングの仕組みによって、まとめて入出力を行われるようになっているのです。上の実行画面でも、改行が入力されたときにまとめて文字が出力されています。
  なお、通常EOFは-1という整数値であらわされることが多いため、戻り値を受け取る変数chは、char型ではなくintを使います。

重要

1文字入力するには、getchar()関数を使う。
1文字出力するには、petchar()関数を使う。

コメント

タイトルとURLをコピーしました