1. ホーム
  2. c++

エスケープシーケンス'˶'ᵕ'˶'の使い方は?

2023-08-22 02:03:54

質問

以下のような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 ?

どのように解決するのですか?

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

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

で、印刷すると \r を表示することで、端末エミュレータの現在の行を上書きすることができます。

トム・ジッチ は、なぜあなたのプログラムの出力が o world であるのに対して \r は行末にあり、それ以降は何も出力しません。

プログラムが終了するとき、シェルはコマンドプロンプトを表示します。ターミナルはカーソルを置いた場所にそれを表示します。プログラムはカーソルを行頭に置いたままなので、コマンドプロンプトは表示した行を一部上書きしています。このため、コマンドプロンプトの後に o world .

オンラインコンパイラ はブラウザに生の出力を出力するだけです。ブラウザは制御文字を無視するので \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;
}

という文字が繰り返し表示されます。 - \ | / が回転しているように見せるため、同じ位置で | が回転しているように見える。