私はeofとgetcharの下にしようとしています()

Aug 22 2020

以下に示すコードの一部。末尾にctrl + zを付けて文字のセットを入力するときはいつでも、getchar()のEOFをマークする必要があります。すべての文字を、ASCII値が26の最後の別の文字と一緒に印刷しています。名前で文字がわかりません。

ctrl + zを入力すると、プログラムが終了することを期待しています。ただし、Ctrl + zは、入力ストリームが空の場合にのみ機能します。

プログラムを終了する代わりに、なぜそのようなawkard文字を返すのか誰かが説明できますか?

#include<stdio.h>
#include<ctype.h>

int main(){

   int c;

   while((c = getchar()) != EOF)
       putchar(c);

   return 0;
}

申し訳ありませんが、画像をアップロードできませんでした。また、その値が26の文字を表示する方法もありません。ASCIIテーブルチャートでは、26は/ replace /であると示されています。それが何を意味するのかわかりません。ありがとうございました。

回答

1 Gilles'SO-stopbeingevil' Aug 22 2020 at 16:11

Ctrl + Zは、Ctrl + A、Ctrl + B、Ctrl + @などのASCII制御文字です。そうではありませんEOFEOFは他の文字とは異なります。そうでない場合、getchar()その値が返された場合、ファイルの終わりに到達したのか、その文字を読み取ったのかがわかりません。Ctrl + ZのASCII値は26です。入力した内容が表示されます。

オペレーティングシステム(おそらくWindows)では、行の先頭にあるCtrl + Zは、入力が終了したことを端末に示します。(より正確には、コードはターミナル自体からではなく、ターミナルから読み取るライブラリ関数にあると思います。しかし、私はWindowsの専門家ではないため、詳細が間違っている可能性があります。)最初からしか機能しません。これは、ターミナルから読み取るライブラリコードが機能するためです。行の先頭にCtrl + Zを入力するgetchar()と、ファイルの終わりの状態が表示され、が返されますEOF

行の先頭ではなくCtrl + Zを入力すると、通常の文字として扱われます。Windowsは、印刷できない文字を示すために使用する「奇妙なグリフ」として印刷します。

ほとんどのASCII文字の公式の意味はずっと前に忘れられていました。「ファイルの終わり」、より正確には「送信の終わり」を意味するために使用されるASCII制御文字があります。これはCtrl + Dであり、Unixオペレーティングシステムファミリでは、で入力すると「入力の終わり」を意味します。 WindowsのCtrl + Zによく似た、端末の行の先頭。Ctrl + ZとWindowsのファイルの終わりとの関連付けは、MicrosoftのDOSとWindowsがインスピレーションを得たオペレーティングシステムの異なる歴史的なライン、主にDECから来ています。

あなたとまったく同じ質問ではありませんが、この回答をお勧めします。これは、についての混乱を解消するのに役立ちますEOF