113

それで、私はついにK&Rを読んでいて、最初の数ページで、バックスペースエスケープ文字があることを学びました\b

だから私はそれをテストするために行きます、そしていくつかの非常に奇妙な振る舞いがあります:

#include <stdio.h>

main ()
{
    printf("hello worl\b\bd\n");
}

出力は

hello wodl

誰かがこれを説明できますか?

4

5 に答える 5

164

結果は、使用している端末またはコンソールプログラムの種類によって異なりますが、ほとんど\bの場合、非破壊的なバックスペースです。カーソルを後方に移動しますが、そこにあるものは消去されません。

そのため、hello worl一部のコードは出力します

こんにちは世界
          ^

...(ここ^でカーソルの位置を示します)次に、(端末上で)消去せず\bにカーソルを2桁後方に移動する2文字を出力します。

こんにちは世界
        ^

カーソルがにあることに注意してくださいr。次に、を出力しますd。これにより、が上書きされ、次のようにrなります。

こんにちはwodl
         ^

最後に、\n非破壊的な改行であるを出力します(これも、明らかにあなたのものを含むほとんどの端末で)ので、l変更されずにカーソルが次の行の先頭に移動します。

于 2011-07-22T16:12:35.420 に答える
128
.........。
^<=「プリントヘッド」へのポインタ
            /* part1 */
            printf("hello worl");
こんにちは世界
          ^<=「プリントヘッド」へのポインタ
            /* part2 */
            printf("\b");
こんにちは世界
         ^<=「プリントヘッド」へのポインタ
            /* part3 */
            printf("\b");
こんにちは世界
        ^<=「プリントヘッド」へのポインタ
            /* part4 */
            printf("d\n");
こんにちはwodl

^<=次の行の「プリントヘッド」へのポインタ
于 2011-07-22T16:13:37.920 に答える
47

破壊的なバックスペースが必要な場合は、次のようなものが必要になります

"\b \b"

つまり、バックスペース、スペース、および別のバックスペースです。

于 2011-07-22T16:31:02.607 に答える
8

説明するのはそれほど難しいことではありません...これは、入力hello worlして、左矢印キーを2回押し、入力dして、下矢印キーを押すようなものです。

少なくとも、それはあなたの端末が\b\nコードを妨害していると私が推測する方法です。

出力をファイルにリダイレクトすると、他の何かが完全に得られるに違いありません。違いを確認するには、ファイルのバイトを確認する必要があるかもしれませんが。

[編集]

少し詳しく説明すると、これprintfは一連のバイトを出力します。hello worl^H^Hd^Jここで、^HはASCII文字#8、^JはASCII文字#10です。画面に表示される内容は、端末がこれらの制御コードをどのように解釈するかによって異なります。

于 2011-07-22T16:10:57.820 に答える
2

各文字の後に1つのバックスペースを使用します printf("hello wor\bl\bd\n");

于 2011-11-27T02:04:29.983 に答える