K.Maebashi's BBS

ご自由に書き込んでください。雑談も可。
テスト書き込みの類はテスト用掲示板にどうぞ

[日付順表示] [日付順インデックス] [スレッド順インデックス]

新規投稿 | 開設者ホームページへ戻る | ヘルプ

[2254] C言語体当り学習 filter.cプログラム
投稿者:Hiroyuki Naito
2021/06/25 23:45:12

首記のプログラムをダウンロードして、gcc+VSCode(ターミナルはcommnad prompt)で 実行してみました。 123 123 ^Z のように、 123<enter>^Zと入力するとEOFを検知してプログラムが終了しますが、 123^Z<enter>のように入力するとプログラムが終了しません。 if文の前にprintf(" %d ", ch);を挿入して文字コードを表示させると、 前者の^Zは-1、後者の^Zは26と表示されます。^Zはよくひとつ前の状態に戻る 動作のショートカットキーに使われていたりするのが原因でしょうか。 また、getchar()は「標準入力から1文字読み込む」とありますが、EOF(FFFFFFFF) という4バイトのコードに対してはどのような動作で読み込んでいるのでしょうか。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2255] Re:C言語体当り学習 filter.cプログラム
投稿者:(ぱ)こと管理人
2021/06/27 00:32:44

>123 >123 >^Z > >のように、 >123<enter>^Zと入力するとEOFを検知してプログラムが終了しますが、 >123^Z<enter>のように入力するとプログラムが終了しません。 本当ですね。正直なところ、この挙動は私は認識していませんでした。 ちなみに123^Z456<enter>と入力すると、プログラムは終了しませんが、 456は読み込まれません。 >if文の前にprintf(" %d ", ch);を挿入して文字コードを表示させると、 >前者の^Zは-1、後者の^Zは26と表示されます。^Zはよくひとつ前の状態に戻る >動作のショートカットキーに使われていたりするのが原因でしょうか。 後者の^Zの26は、ASCIIの制御文字におけるSUBで、これをキーボードから入力する 手段が^Zです。以下Wikipediaを参照してください。 https://ja.wikipedia.org/wiki/%E5%88%B6%E5%BE%A1%E6%96%87%E5%AD%97 つまり、コマンドプロンプト上で^Zを入力すると、それが行頭である場合に限り getchar()はEOFを返すが、そうでなければ^Zをそのまま返す、ただし、行内で ^Zより後ろの文字は返さない、ということになります。 これは、コマンドプロンプトの端末ドライバの仕様ということになると思います。 すっきりしない回答で申し訳ありません。 >また、getchar()は「標準入力から1文字読み込む」とありますが、EOF(FFFFFFFF) >という4バイトのコードに対してはどのような動作で読み込んでいるのでしょうか。 「C言語 体当たり学習徹底入門」では、getchar()について 『getchar()は、標準入力から1文字読み込み、その文字コードを返します。  ファイルの末尾に来たら、EOFを返します。』 と書きました。これはgetchar()(を含むCの標準ライブラリ)の仕様です。 ファイルの末尾に来たらEOFを返す、というだけで、そのEOFはどこからも読み込まれる わけではありません。Hiroyuki Naitoさんも試されたとおり、^Zは26であって -1ではありません。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2256] Re:C言語体当り学習 filter.cプログラム
投稿者:Hiroyuki Naito
2021/06/27 09:08:27

ご回答ありがとうございました。 今まで^Zによって、キーボードからはEOF(-1)が出力されると思い込んでいました。 「getchar()が行頭の^Z(=26)をファイルの末尾と判断して、EOFを戻り値として 出力する」というご説明ですっきりしました。 >つまり、コマンドプロンプト上で^Zを入力すると、それが行頭である場合に限り >getchar()はEOFを返すが、そうでなければ^Zをそのまま返す、ただし、行内で >^Zより後ろの文字は返さない、ということになります。 >これは、コマンドプロンプトの端末ドライバの仕様ということになると思います。 ----- 中略 ----- >ファイルの末尾に来たらEOFを返す、というだけで、そのEOFはどこからも読み込まれる >わけではありません。Hiroyuki Naitoさんも試されたとおり、^Zは26であって >-1ではありません。 >
[この投稿を含むスレッドを表示] [この投稿を削除]