\n
(改行)と\r
(改行)の違いは何ですか?
特に、\n
と\r
の間に 実用的 の違いはありますか?一方を他方の代わりに使用すべき場所はありますか。
ASCIIコードに関しては、それぞれ10と13であるため、3です;-)。
しかし、真剣に、多くがあります:
\n
は行末コードであり、\r
は特別なものを意味しません\n
は行末の標準エスケープシーケンスです(必要に応じてOS固有のシーケンスとの間で変換されます)。\r
は代わりに行末のコードでした\r\n
の2文字です\r\n
はインターネット上のテキスト形式の標準的な行末です。\r
は左端に停止するまでキャリッジを左方向に戻すように命令し(低速操作)、\n
はローラーに1行巻き上げるように命令します(はるかに高速)操作)-それが常に\r
before\n
を持っているため、キャリッジが移動している間にローラーが移動できるようにするためです。まだ左に行く!-)ウィキペディアには 詳細な説明 があります。\r
および\n
は同様に動作します(カーソルの点で両方を除くisキャリッジまたはローラーなし;-)実際には、テキストファイルへの書き込みという現代のコンテキストでは、常に\n
を使用する必要があります(Windowsなどの奇妙なOSを使用している場合、基礎となるランタイムはそれを変換します;-)。 \r
を使用する唯一の理由は、文字端末(または、おそらくそれをエミュレートする「コンソールウィンドウ」)に書き込みを行い、次に書き込む行で、最後に書き込んだ行を上書きすることです(使用される場合があります)進行状況バーなどの間抜けな「asciiアニメーション」効果のため)-これはGUIの世界ではかなり時代遅れになっています;-)。
歴史的には、\n
はキャリッジを下に移動するために使用され、\r
はキャリッジをページの左側に戻すために使用されていました。
2つの異なるキャラクター.
Unixテキストファイルでは、\n
が行末ターミネータとして使用されています
\r
は、Macのテキストファイルでは行末ターミネータとして使われています
\r\n
(つまりboth)は、WindowsとDOSのテキストファイルの行を終了するために使用されます。
他に誰もそれを具体的に述べていないので(知っている/覚えておくには若すぎますか?) - 私は\r\n
の使用がタイプライターや同様の装置に由来すると思います。
複数行に対応したタイプライターを使用しているときに新しい行が必要な場合は、2つの物理的なアクションを実行する必要がありました。キャリッジをページの先頭(米国では左)までスライドさせ、用紙を1段切り上げる。
たとえば、太字のテキストを印刷する唯一の方法は、改行なしでキャリッジリターンを実行し、古い文字の上に同じ文字を印刷して、インクを追加して暗く表示することでした。 。機械的な「改行」機能がタイプライターで失敗したとき、これは厄介な結果でした。あなたが注意を払わなかったなら、あなたはテキストの前の行を上書きすることができました。
異なるオペレーティングシステム用の2つの異なる文字。 これは、TCP/IP
を介して転送されるデータでも役割を果たします。\r\n
を使用する必要があります。
\n
Unix
\r
Mac
\r\n
WindowsとDOS。
完了するために、
シェル(bash)スクリプトでは、\r
を使ってカーソルを行頭に送り、もちろん\n
を使ってカーソルを新しい行に置くことができます。
たとえば、
echo -en "AA--AA" ; echo -en "BB" ; echo -en "\rBB"
AA--AA
AA--AABB
BB--AABB
しかし-en
をパラメータとして使うことを忘れないでください。
Windowsでは、\ nは次の行の先頭に移動します。\rは、次の行に移動せずに現在の行の先頭に移動します。私は自分のコンソールアプリケーションでコードをテストしているところでテキストを画面上にスクロールしたくないので、自分のコンソールアプリケーションで使っています。 FPS)、私はprintf( "% - 10d\r"、fps)します。これは次の行に移動することなくカーソルを行の先頭に戻し、フレームレートが常に同じ行で更新されている間にスクロールされない他の情報を画面に表示できるようにします(%-10は出力が少なくとも10文字であることを確認し、左寄せにしてスペースで埋めて、その行の古い値を上書きします。これは、私がコンソール画面にデバッグ情報を出力しているときによく使われます。
ちょっとした歴史
/ rは "return"または "キャリッジリターン"の略で、タイプライターの歴史です。キャリッジリターンがキャリッジを右端まで移動させたため、行頭で入力していました。
/ nは、改行した日から新しい行に移動したときの「改行」を表します。それがタイプライターがそれをした順序であったので、それはそれの開始に躊躇しないけれども、それはなぜいくつかのOSが/ r改行に続く/ n改行の両方の必要性を採用した。 「キャリッジリターン」から、「Enter」ではなく「Return」を使用すること。
混乱を招くだけですが、私はブラウザのHTMLページのTextArea要素を使用して簡単なテキストエディタを作成しています。 CR/LFに関して互換性の問題があることを見越して、私はプラットフォームをチェックするためのコードを書き、そのプラットフォームに適用可能な改行規約を使用しました。
しかし、TextAreaに含まれる actual 文字をチェックするときに、文字に対応する16進数データを生成する小さなJavaScript関数を介して、面白いことを発見しました。
テストのために、私は次のテキストを入力しました:
こんにちは、世界[enter]
さようなら、残酷な世界[enter]
テキストデータを調べたときに得られたバイトシーケンスは次のとおりです。
48 65 6c 6c 6f 2c 20 57 6f 72 6c 64 0a 47 6f 6f 64 62 79 65 2c 20 43 72 75 65 6c 20 57 6f 72 6c 64 0a
さて、ほとんどの人はこれを見て、0aだが0dバイトは見えないが、この出力はUnix/Linuxプラットフォームで得られたと思うだろう。しかし、ここにこすれがあります:私はWindows 7 64ビット上のGoogle Chromeで得たこのシーケンス。
そのため、TextArea要素を使用してテキストを調べる場合は、上で行ったように出力をチェックして、実際の文字バイトがTextAreaから返されることを確認します。これが他のプラットフォームや他のブラウザと異なるかどうかはまだわかりませんが、JavaScriptを介してテキスト処理を実行している場合は、そのテキスト処理プラットフォームを独立させる必要があります。
上記の記事で取り上げられている規約は console outputに適用されますが、HTML要素はUNIX/Linuxの規約に準拠しているようです。他の人が別のプラットフォームやブラウザで発見しない限り。
#include <stdio.h>
void main()
{
int countch=0;
int countwd=1;
printf("Enter your sentence in lowercase: ");
char ch='a';
while(ch!='\r')
{
ch=getche();
if(ch==' ')
countwd++;
else
countch++;
}
printf("\n Words = ",countwd);
printf("Characters = ",countch-1);
getch();
}
この例を見てみましょう\ rの代わりに\ nを入れてみてください。