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を宣言しています。
getchar()を使って標準入力から1文字ずつ読み込み、文字「0」が現れるまでputchar()で順番に出力します。- 「0」を読み込んだ時点でループを抜けますが、このとき変数
cには「0」が格納されています。 ungetc(c, stdin)によって、この「0」を標準入力ストリームに押し戻します。- その後、もう一度
getchar()を呼び出すと、押し戻された「0」を再び読み込むことができ、putchar()で出力されます。 - 最後に改行を出力し、「The End!」と表示して終了します。
このようにungetc()を使うことで、「読みすぎた1文字」をストリームに戻し、あたかもまだ読み込んでいないかのように扱うことができます。入力の解析処理などで非常に便利な関数です。
-
C/C++のmemcpy()関数の使い方と実例解説
この記事では、C++ STLにおけるmemcpy()関数の動作、構文、および具体的な使用例について詳しく解説します。 memcpy()とは? memcpy()関数は、C++ STLに組み込まれた標準関数の一つで、<cstring>ヘッダーファイルで定義されています。この関数はメモリブロックをコピーするために使用され、あるメモリ位置から別のメモリ位置へ、指定されたバイト数分のデータを転送します。 関数の実行結果は、データのバイナリコピーとなります。重要な点として、memcpy()は終端のNULL文字やその他の終端記号をチェックしません。単純にソースから指定されたバイト数(num)をそ
-
C/C++で学ぶAA木(AA Tree)とは?基本概念と平衡化操作を徹底解説
AA木(AA Tree)とはコンピュータサイエンスにおいて、AA木(AA Tree)とは、順序付きデータを効率的に格納・検索するために実装された平衡木(バランスドツリー)の一種です。AA木は、赤黒木(Red-Black Tree)の変種として扱われます。赤黒木は二分探索木の一形態であり、要素の追加や削除を効率的にサポートします。赤黒木と大きく異なる点は、AA木では赤いノードを右の子としてのみ追加でき、左の子としては配置できないという制約があることです。この制約により、2-3-4木ではなく2-3木をシミュレートすることになり、その結果、木の保守操作が大幅に簡素化されます。赤黒木の平衡化アルゴリズ