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