web-dev-qa-db-ja.com

「バックスペース」エスケープ文字「\ b」:予期しない動作?

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

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

#include <stdio.h>

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

出力は

hello wodl

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

89
OregonTrail

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

したがって、hello worl部分については、コード出力

 hello worl 
 ^ 

...(where ^はカーソルの位置を示します)次に、カーソルを2箇所後方に移動する2つの\b文字を出力しますwithout消去(端末上):

 hello worl 
 ^ 

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

 hello wodl 
 ^ 

最後に、\nを出力します。これは非破壊的な改行です(明らかに、あなたの端末を含むほとんどの端末で)。したがって、lは変更されずに残り、カーソルは次のライン。

128
T.J. Crowder
.......... 
 ^ <=「印字ヘッド」へのポインタ
            /* part1 */
            printf("hello worl");
hello worl 
 ^ <=「印字ヘッド」へのポインタ
            /* part2 */
            printf("\b");
hello worl 
 ^ <=「印字ヘッド」へのポインタ
            /* part3 */
            printf("\b");
hello worl 
 ^ <=「印字ヘッド」へのポインタ
            /* part4 */
            printf("d\n");
hello wodl 
 
 ^ <=次の行の「印字ヘッド」へのポインタ
119
pmg

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

"\b \b"

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

42
Peter K.

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

少なくとも、それはあなたの端末が\b\nコードをインターペッティングしていると推測する方法です。

出力をファイルにリダイレクトすると、まったく別のものが得られます。ただし、違いを確認するにはファイルのバイトを調べる必要があります。

[編集]

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

8
Nemo

各文字の後に単一のバックスペースを使用するprintf("hello wor\bl\bd\n");

1
Dorothea