web-dev-qa-db-ja.com

getcを使用してコンソールから\ r(キャリッジリターン)と\ n(改行)を読み取りますか?

私は基本的にユーザーが「Enter」を押すのを待ってから何かをする関数を書いています。テスト時に機能することがわかったのは次のとおりです。

_#include <stdio.h>

int main()
{
        int x = getc(stdin);
        if (x == '\n') {
                printf("carriage return");
                printf("\n");
        }
        else {
                printf("missed it");
                printf("\n");
        }
}
_

私が持っている質問、そして私が最初に試みたのはif (x == '\r')でしたが、テスト中にプログラムがエンターを打つのを捕らえませんでした。 _'\n'_は、コンソールからEnterキーを押すことに対応しているようです。誰かが違いを説明できますか?また、確認するには、_if... == "\n"_として記述すると、文字列リテラルを意味しますか?すなわち、ユーザーは文字通りコンソールから_"\n"_を入力する必要がありますか?

23
MCP

_\n_は改行文字であり、_\r_は改行です。それらはそれらを使用するものが異なります。 Windowsは_\r\n_を使用してEnterキーが押されたことを示し、LinuxとUnixは_\n_を使用してEnterキーが押されたことを示します。

したがって、すべての人が使用するため、常に_\n_を使用します。 if (x == '\n')は、文字の等価性をテストする適切な方法です。

40
Whymarrh

「\ n」は「改行」で、「\ r」は改行です。異なるオペレーティングシステムは、次のように新しい行を異なる方法で処理します。

Windows

改行は、2つの文字「\ r\n」の組み合わせである必要があります。

Linux\UnixおよびModern Mac OS

新しい行に単一の「\ n」を使用します。

クラシックMac OS

新しい行に単一の「\ r」を使用します。

基本的に、現在のすべてのオペレーティングシステムで使用されているif (x == '\n')を使用します。

13
josephthomas

また、25文字を入力してEnterキーを押すと、最初のgetcは25文字すべてを入力してEnterキーを押すまで戻りません。入力時に文字を読み取るには、プラットフォーム固有のコードが必要です。したがって、fgetsを文字列に実行し、改行をトリミングし、入力行全体を処理することにより、行全体を読み取るだけの方がよい場合があります。

3
Alex Measday

プログラミング言語ランタイム、テキストエディター、OSなど、新しい行を表す抽象化にはいくつかのレベルがあります。 CR(キャリッジリターン)とLF(ラインフィード)は、ASCIIで定義される2つの制御文字です。他の文字エンコーディングでは、「改行」文字も定義される場合があります。 「次の行の先頭に」という意味を伝えます。キーボードは、Enterキーを対応する1つまたは複数の制御文字にマップする方法を決定します。キーボードによってはEnterキーとReturnキーを区別します。標準のANSIキーボードには、ASCIIのキャリッジリターン文字(13)にマッピングされるEnterキーのみがあります。これは、デバイスによってOSに送信される実際のコンテンツです。 Enterキーの解釈が異なるため、Unixライクシステムでは、入力を受け取るプログラムに渡す前に、キャリッジリターンが改行文字(ASCIIで10)に変換されます。Windowsでは、CRは2つの文字に変換されます- CRの後にLFが続きますが、入力ストリームを設定できますrawモードになります。この場合、プログラムはキーボードが実際に送信するものを取得します。これでエディターが登場します。エディターは、rawモードでstdinからCRを受け取ると、CRがキーボードのEnterキーに対応することを認識し(キーボードに関する想定)、画面に新しい行を表示することになっています。 rawモードでは、writeシステムコールを呼び出してCR + LFを出力する必要があります。出力ストリームがrawモードでない場合、テキストエディターは、LinuxでLFなどのOS固有のシーケンスを出力する必要があります。

最後に、言語ランタイムは独自の方法で新しい行を解釈することもできます。たとえば、C標準では、ファイルをテキストモードで書き込む場合、「\ n」はシステムで使用されるネイティブの改行シーケンスに透過的に変換されます。これは1文字より長い場合があります。テキストモードで読み取る場合、ネイティブの改行シーケンスは「\ n」に変換されます。バイナリモードでは、変換は実行されず、「\ n」によって生成された内部表現が直接出力されます。 「\ n」および「\ r」は、それぞれC言語のような言語で一般的なLFおよびCRを表す言語固有の文字であることに注意してください。

2番目の質問では、「\ n」は「\ n」の後に「\ 0」ターミネータが続きます。コンソールから「\ 0」を入力する方法はありません。

1
Tong Zhou