2012-04-07 6 views
17

私は、基本的にユーザーが「入力」して何かをするのを待つ関数を書いています。私はテストが以下のときに動作していることがわかりました: r(キャリッジリターン)と c(改行)をコンソールからgetcで読み取っていますか?

#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')をしかし、テストでは、プログラムは、Enterキーを押す私をキャッチしていません。 '\n'は、私がコンソールから入力を打つことに対応しているようです。誰かがその違いを説明できますか?また、確認するには、if... == "\n"と書くことは、文字列リテラルを意味するでしょうか?つまり、ユーザーは文字通りコンソールから"\n"と入力する必要がありますか?

+0

関連:http://stackoverflow.com/questions/1355095/what-is-the-difference-between-r-and-n – Mysticial

+1

Cはエスケープを一重引用符と二重引用符の両方に適用するので、 "\ n"は最初のASCIIコード10(\ n自体)と2番目のASCII NUL(ヌルターミネータ)である長さ2文字の文字列。 – toriningen

+1

(タイトルの編集は気にしないことを願っています。) –

答えて

26

\nは改行文字で、\rは送料の返品です。彼らはそれらを使用する点で異なります。 Windowsは\r\nを使用してEnterキーが押されたことを示し、LinuxおよびUnixは\nを使用してEnterキーが押されたことを示します。

したがって、私はいつも\nを使用しています。文字平等をテストする適切な方法はif (x == '\n')です。

13

「\ n」は「改行」で、「\ r」は改行記号です。異なるオペレーティングシステムは、このような

のWindows

など、さまざまな方法で新しい行を、処理することは、改行は2つの文字、「\ rを\ n」の組み合わせであることを期待しています。

のLinux \ Unixと現代のMac OS

新しい行のための単一の '\ n' を使用します。

クラシックのMac OS

は、新しい行のための単一の '\ rを' を使用します。

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

+0

Macのバージョンは、[newline](http://en.wikipedia.org/wiki/Newline)のバージョンによって異なります。 –

+3

現代のMac OS XはUNIXで、\ n改行を使っているので、あなたはClassic Mac OSを '\ r'改行に使うと思います。 – toriningen

+0

あなたはどちらも正しいです、もっと具体的であったはずです。 – josephthomas

2

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

0

使用gets()を使用すると、バッファオーバーフローの悪用が可能になり、結果としてシェルコード攻撃が発生する可能性があります。 fgets()を使用し、バッファサイズを渡す必要があります。

+3

これはコメントであり回答ではありません – Pranjal

0

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

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

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