Cプログラミング
 Computer >> コンピューター >  >> プログラミング >> Cプログラミング

C言語のungetc()関数とは?文字をストリームに押し戻す方法を解説

ungetc()関数の概要

C言語のungetc()関数は、一度読み込んだ1文字をストリームに押し戻す(プッシュバックする)ための関数です。押し戻された文字は、その後の読み込み操作で再度取得することができます。

この関数は、例えば「ある文字を読んでみて、それが意図したものではなかった場合に元に戻したい」といった場面で役立ちます。トークナイザやパーサの実装などでよく使われるテクニックです。

ungetc()の構文

int ungetc(int character, FILE *stream);

引数

  • character … ストリームに押し戻す文字(int型で指定します)
  • stream … 対象となるFILEオブジェクトへのポインタ

戻り値

成功した場合は押し戻された文字が返されます。失敗した場合はEOFが返されます。

注意点

  • 押し戻しが保証されているのは1文字だけです。連続して複数回呼び出しても、すべての文字が戻るとは限りません。
  • EOFを押し戻すことはできません。
  • 押し戻された文字は、ファイルの読み取り位置を巻き戻すわけではなく、ストリーム上で次に読み込まれる位置に挿入されます。

サンプルコード

以下は、C言語におけるungetc()の使用例です。

#include <stdio.h>

int main(void) {
    int c;
    // '0' が入力されるまで文字を読み込んで出力する
    while ((c = getchar()) != '0')
        putchar(c);
    // 読み込んだ文字('0')を標準入力ストリームに押し戻す
    ungetc(c, stdin);
    // 押し戻した文字を再度読み込む
    c = getchar();
    putchar(c);
    puts("");
    printf("The End!");
    return 0;
}

実行結果

s a b c t h 0
0
The End!

プログラムの解説

このプログラムでは、まずint型の変数cを宣言しています。

  1. getchar()を使って標準入力から1文字ずつ読み込み、文字「0」が現れるまでputchar()で順番に出力します。
  2. 「0」を読み込んだ時点でループを抜けますが、このとき変数cには「0」が格納されています。
  3. ungetc(c, stdin)によって、この「0」を標準入力ストリームに押し戻します。
  4. その後、もう一度getchar()を呼び出すと、押し戻された「0」を再び読み込むことができ、putchar()で出力されます。
  5. 最後に改行を出力し、「The End!」と表示して終了します。

このようにungetc()を使うことで、「読みすぎた1文字」をストリームに戻し、あたかもまだ読み込んでいないかのように扱うことができます。入力の解析処理などで非常に便利な関数です。

  1. C/C++のmemcpy()関数の使い方と実例解説

    この記事では、C++ STLにおけるmemcpy()関数の動作、構文、および具体的な使用例について詳しく解説します。 memcpy()とは? memcpy()関数は、C++ STLに組み込まれた標準関数の一つで、<cstring>ヘッダーファイルで定義されています。この関数はメモリブロックをコピーするために使用され、あるメモリ位置から別のメモリ位置へ、指定されたバイト数分のデータを転送します。 関数の実行結果は、データのバイナリコピーとなります。重要な点として、memcpy()は終端のNULL文字やその他の終端記号をチェックしません。単純にソースから指定されたバイト数(num)をそ

  2. C/C++で学ぶAA木(AA Tree)とは?基本概念と平衡化操作を徹底解説

    AA木(AA Tree)とはコンピュータサイエンスにおいて、AA木(AA Tree)とは、順序付きデータを効率的に格納・検索するために実装された平衡木(バランスドツリー)の一種です。AA木は、赤黒木(Red-Black Tree)の変種として扱われます。赤黒木は二分探索木の一形態であり、要素の追加や削除を効率的にサポートします。赤黒木と大きく異なる点は、AA木では赤いノードを右の子としてのみ追加でき、左の子としては配置できないという制約があることです。この制約により、2-3-4木ではなく2-3木をシミュレートすることになり、その結果、木の保守操作が大幅に簡素化されます。赤黒木の平衡化アルゴリズ