だから私は最終的に K&R を読んでいて、最初の数ページでバックスペースエスケープ文字\b
があることを学びました。
だから私はそれをテストしに行きます、そしていくつかの非常に奇妙な振る舞いがあります:
#include <stdio.h>
main ()
{
printf("hello worl\b\bd\n");
}
出力は
hello wodl
誰でもこれを説明できますか?
結果は、使用している端末またはコンソールプログラムの種類によって異なりますが、ほとんどの\b
は非破壊的バックスペースです。カーソルを後方に移動しますが、そこにあるものを消去しません。
したがって、hello worl
部分については、コード出力
hello worl ^
...(where ^
はカーソルの位置を示します)次に、カーソルを2箇所後方に移動する2つの\b
文字を出力しますwithout消去(端末上):
hello worl ^
カーソルがr
にあることに注意してください。次に、d
を出力します。これにより、r
が上書きされ、次の結果が得られます。
hello wodl ^
最後に、\n
を出力します。これは非破壊的な改行です(明らかに、あなたの端末を含むほとんどの端末で)。したがって、l
は変更されずに残り、カーソルは次のライン。
.......... ^ <=「印字ヘッド」へのポインタ
/* part1 */
printf("hello worl");
hello worl ^ <=「印字ヘッド」へのポインタ
/* part2 */
printf("\b");
hello worl ^ <=「印字ヘッド」へのポインタ
/* part3 */
printf("\b");
hello worl ^ <=「印字ヘッド」へのポインタ
/* part4 */
printf("d\n");
hello wodl ^ <=次の行の「印字ヘッド」へのポインタ
破壊的なバックスペースが必要な場合は、次のようなものが必要です。
"\b \b"
つまり、バックスペース、スペース、および別のバックスペース。
説明するのは難しいことではありません...これは、hello worl
と入力し、左矢印キーを2回押し、d
と入力して、下矢印キーを押すようなものです。
少なくとも、それはあなたの端末が\b
と\n
コードをインターペッティングしていると推測する方法です。
出力をファイルにリダイレクトすると、まったく別のものが得られます。ただし、違いを確認するにはファイルのバイトを調べる必要があります。
[編集]
少し詳しく説明すると、このprintf
は一連のバイトを出力します:hello worl^H^Hd^J
、ここで^H
はASCII文字#8および^J
はASCII文字#10。画面に表示される内容は、端末がこれらの制御コードをどのように解釈するかによって異なります。
各文字の後に単一のバックスペースを使用するprintf("hello wor\bl\bd\n");