C言語のgetchar関数とscanf関数の違いをわかりやすく詳しく解説

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はそれぞれ特徴的な機能を持っています。使うシチュエーションや目的に応じて使い分けることが大切です。

目次