web-dev-qa-db-ja.com

「\ r」エスケープシーケンスの使用とは何ですか?

次のようなCコードがあります。

#include<stdio.h>
int main()
{
    printf("Hey this is my first hello world \r");
    return 0;
}

実験として\rエスケープシーケンスを使用しました。コードを実行すると、出力が次のようになります。

o world

なぜですか、そして\rの正確な使用は何ですか?

オンラインコンパイラで同じコードを実行すると、次のような出力が得られます。

Hey this is my first hello world

オンラインコンパイラが\rを無視して異なる出力を生成したのはなぜですか?

52
Ant's

\rキャリッジリターン文字です。端末エミュレーターに、行の先頭でカーソルを移動するように指示します。

cursorは、次の文字がレンダリングされる位置です。

したがって、\rを出力すると、ターミナルエミュレータの現在の行を上書きできます。

Tom Zych プログラムの出力がo worldであるのに\rが行末にあり、その後何も出力しない理由を考えました:

プログラムが終了すると、シェルはコマンドプロンプトを出力します。端末は、カーソルを置いた場所に表示します。プログラムはカーソルを行の先頭に残すため、コマンドPromptは印刷した行を部分的にオーバーライドします。これは、コマンドプロンプトの後にo worldが続く理由を説明しています。

online compilerは、生の出力をブラウザに出力するだけです。ブラウザは制御文字を無視するため、\rは効果がありません。

https://en.wikipedia.org/wiki/Carriage_return を参照してください

\rの使用例を次に示します。

#include <stdio.h>
#include <unistd.h>

int main()
{
        char chars[] = {'-', '\\', '|', '/'};
        unsigned int i;

        for (i = 0; ; ++i) {
                printf("%c\r", chars[i % sizeof(chars)]);
                fflush(stdout);
                usleep(200000);
        }

        return 0;
}

-\|/という文字を同じ位置に繰り返し出力して、端末で|が回転しているように見せます。

81
Arnaud Le Blanc

プログラムは"Hey this is my first hello world "を出力し、カーソルを行の先頭に戻しています。これが画面上でどのように見えるかは、環境によって異なります。文字列の先頭が何か、おそらくコマンドラインプロンプトで上書きされているようです。

23
Tom Zych

「\ r」は「キャリッジリターン」の略です。これはタイプライターや本当に古いプリンターの時代からの持ち越しです。最良の例は、Windowsおよびその他のDOSsy OSで、改行が「\ r\n」として指定されている場合です。これらは、新しい行を開始するために古いプリンタに送信される指示です。最初にプリントヘッドを先頭に戻し、次に下に移動します。

異なるOSは、他の改行シーケンスを使用します。 LinuxおよびOSXは「\ n」を使用します。古いMac OSは '\ r'を使用します。 Wikipedia にはもっと完全なリストがありますが、それらは重要なリストです。

お役に立てれば!

PS:その奇妙な出力が得られる理由については...コンソールが「カーソル」を行の先頭に戻し、最初のビットをスペースまたは合計で上書きしている可能性があります。

8
Xavier Holt

\rカーソルを行の先頭に移動します。

改行は、システムごとに異なる方法で管理されます。一部は\n(ラインフィード、例:Unix)のみを使用し、一部は(\r例:OS X以前のMacOS)、一部は\r\n(例:Windows afaik)を使用します。

6
Nornagest

Amaud576875が言ったように、\rエスケープシーケンスは、Enterキーを押すのと同様に、キャリッジリターンを意味します。ただし、「o world」を取得する方法がわかりません。 「私の最初のハローワールド」を取得してから、新しい行を取得する必要があります(私もそうします)。使用しているオペレーティングシステム(Macを使用しています)によっては、\nの代わりに\rを使用する場合があります。

2
wchargin

これは時代遅れの技術に由来するものです。古いファッションタイプライタースタイルのプリンターです。紙を進めるローラー(プラテン)と、インクの生地に金属キーを打ち付けるプリントヘッドがありました。

\ rプリントヘッドを左側に戻します。

\ nプラテンを1行進めます。

\ nが発行されていない場合は、行の内容を上書きします(主にテキストに下線を引くために使用されます)。

2
Steve Wellens

質問の一部に回答するには、

\rの使用法は何ですか?

FTP、HTTP、SMTPなどの多くのインターネットプロトコルは、改行と改行で区切られた行で指定されます。そのため、たとえば、電子メールを送信する場合、次のようなコードがあります。

fprintf(socket, "RCPT TO: %s\r\n", recipients);

または、FTPサーバーが許可拒否エラーで応答する場合:

fprintf(client, "550 Permission denied\r\n");
2
Toby Speight

UNIXプラットフォームで実行している場合、DOSプラットフォームで開くテキストファイルを作成する必要がある場合に非常に便利です。

Unixは '\ n'をラインターミネーターとして使用し、dosは '\ r\n'をラインターミネーターとして使用するため、これを使用してdosテキストファイルを作成できます。

1
EvilTeach