C言語において、ユーザーからの入力を受け取る方法として、getchar関数とscanf関数があります。
初心者の方にとっては、どちらを使えば良いか迷うこともあるでしょう。
本記事では、getchar関数とscanf関数の違いについて詳しく解説します。
getchar関数とscanf関数の概要
C言語において、キーボードからの入力を受け取るための関数として、getchar関数とscanf関数などが用意されています。
getchar関数
getchar関数は、標準入力ストリームから1文字ずつ読み込んで返す関数です。戻り値はint型で、読み込んだ文字のASCIIコードが返されます。
例えば、以下のようなコードを実行すると、キーボードから1文字入力を受け取り、その文字のASCIIコードが表示されます。
#include <stdio.h>
int main() {
int c = getchar();
printf("%d\n", c);
return 0;
}
scanf関数
scanf関数は、標準入力ストリームから指定したフォーマットに従ってデータを読み込む関数です。引数にはフォーマット指定子を含める必要があります。
例えば、以下のようなコードを実行すると、キーボードから整数値を入力し、その値が表示されます。
#include <stdio.h>
int main() {
int num;
scanf("%d", &num);
printf("入力された値: %d\n", num);
return 0;
}
getchar関数とscanf関数はどちらも標準入力ストリームからデータを読み込むための関数ですが、使い方が異なります。
getchar関数とscanf関数の違い
C言語において、キーボードからの入力を受け取るgetchar関数とscanf関数は、それぞれ仕様が異なります。
使用の違いについて順番に見ていきましょう。
戻り値の違い
まず最初に、getchar関数とscanf関数の戻り値について見てみましょう。
- getchar関数:int型で文字コードを返す
- scanf関数:成功した変換指定子の個数を返す
getchar関数は、キーボードから1文字入力されるたびにその文字コードを返します。
一方で、scanf関数は指定された変換指定子(%dや%sなど)に対応する入力が成功した場合、その指定子ごとに1を加算して戻り値として返します。
scanf関数では、引数に入力した値を受け取る変数を指定するため、関数そのものの戻り値はフォーマット指定子の数となっています。
入力の扱い方の違い
次に、getchar関数とscanf関数の入力の扱い方について見てみましょう。
- getchar関数:改行文字も含めて1文字ずつ読み込む
- scanf関数:空白文字(スペースやタブ)で区切られた複数単語を同時に読み込める
getchar関数は改行文字も含めて1文字ずつ読み込むため、改行まで入力された全ての文字を処理するには、標準ストリームが空になるまでループ処理する必要があります。
一方でscanf関数は空白文字(スペースやタブ)で区切られた複数単語を同時に読み込めるため、複雑な入力形式でも比較的簡単な処理が可能です。
使い分けのポイント
最後に、getchar関数とscanf関数の使い分けポイントを紹介します。
- getchar関数:1文字ずつ処理する場合や改行まで待ってから処理する場合
- scanf関数:空白区切り以外でも複雑な形式で入力される場合
例えば、「Hello, World!」という文をキーボードから入力させる場合、
#include <stdio.h>
int main() {
char str[256];
scanf("%s", &s);
printf("%s\n", s);
return 0;
}
このようなプログラムでは、Hello,
しか出力されません。scanf関数は空白文字を区切り文字として認識するため、Hello,
までしかstr
に格納されないのです。
このような問題を回避して1行まるごと読み取る場合はgetchar()
関数が適しています。
#include <stdio.h>
int main() {
char c;
while ((c = getchar()) != '\n') {
printf("%c", c);
}
printf("\n");
return 0;
}
このようなプログラムでは、Hello, World!
全体が出力されます。これはgetcharが空白文字かどうか関係なく1文字ずつ処理することができるためです。
以上より、getcharとscanfはそれぞれ特徴的な機能を持っています。使うシチュエーションや目的に応じて使い分けることが大切です。