"백 스페이스"이스케이프 문자 '\ b': 예기치 않은 동작?


101

그래서 마침내 K & R읽었고 처음 몇 페이지에서 백 스페이스 이스케이프 문자가 있다는 것을 배웠습니다 \b.

그래서 나는 그것을 테스트하기 위해 가서 매우 이상한 행동이 있습니다.

#include <stdio.h>

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

출력은

hello wodl

누구든지 이것을 설명 할 수 있습니까?

답변:


145

결과는 사용중인 터미널 또는 콘솔 프로그램의 종류에 따라 달라 지지만 대부분 \b비파괴적인 백 스페이스입니다. 커서를 뒤로 이동하지만 거기에있는 것을 지우지는 않습니다.

따라서 hello worl부품의 경우 코드는

안녕 worl
          ^

... ( ^커서가있는 위치를 보여줍니다) 그런 다음 지우지 않고\b 커서를 두 곳 뒤로 이동하는 두 문자를 출력 합니다 (터미널에서).

안녕 worl
        ^

커서는 이제 r. 그런 다음을 출력 d하여을 덮어 쓰고 다음 r을 제공합니다.

안녕 wodl
         ^

마지막으로, \n비파괴적인 개행 문자를 출력하므로 (다시 말하지만, 대부분의 터미널에서 사용자 이름을 포함하여) l은 변경되지 않고 커서가 다음 행의 시작 부분으로 이동합니다.


1
지워지지 않으면 왜 "r"이 사라 졌습니까?
cesoid

1
@cesoid : "사용중인 터미널 또는 콘솔 프로그램의 종류에 따라 결과가 달라질 수 있습니다."
TJ Crowder

귀하의 예가 출력에 맞지 않기 때문에 가능한 설명의 예가 아닙니다.
cesoid

5
@cesoid rd. 설명은 여전히 ​​맞습니다.
syockit

1
@cesoid : 터미널에 대해 흥미 롭습니다. Windows에서 cmd.execommand.com터미널이 항상 삽입되는 것은 아닙니다 (Ins 키를 사용하여 동작을 전환 할 수 있음). 내 주 * nix 컴퓨터의 Gnome Terminal이 항상 삽입하고 Ins 키를 기반으로하는 토글이 훨씬 적다는 것을 선호하지 않는 것 같다는 사실에 놀랐습니다. 전에는 몰랐습니다. 분명히 나는 ​​타이핑을 거의 원하지 않습니다. :-)
TJ Crowder

122
..........
^ <= "인쇄 헤드"에 대한 포인터
            /* part1 */
            printf("hello worl");
안녕 worl
          ^ <= "인쇄 헤드"에 대한 포인터
            /* part2 */
            printf("\b");
안녕 worl
         ^ <= "인쇄 헤드"에 대한 포인터
            /* part3 */
            printf("\b");
안녕 worl
        ^ <= "인쇄 헤드"에 대한 포인터
            /* part4 */
            printf("d\n");
안녕 wodl

^ <= 다음 줄의 "인쇄 헤드"에 대한 포인터

파트 4 뒤의 커서가 'l'문자에 있으면 '\ n'으로 바꿔야하지 않습니까? ( "헬로우 법과"결과)
lucas_turci

@lucas_turci : 문제는 '\n'화면에 표현이 없다는 것입니다 . 이미있는 것은 동일합니다. 공백이나 다른 문자 표현으로 대체되지 않습니다.
pmg

44

파괴적인 백 스페이스를 원한다면 다음과 같은 것이 필요합니다.

"\b \b"

즉, 백 스페이스, 공백 및 다른 백 스페이스.


이것은 여전히 ​​공백 문자를 남기지 않습니까?
Pacerier

음, 예, 그러나 후속 \b은 다음 출력 문자가 덮어 쓸 것임을 의미합니다.
Peter K.

1
후속 문자 가 없으면 어떻게합니까?
Pacerier 2014 년

그럼 상관 없죠?
Peter K.

1
흠. 장치가 "마지막 문자 삭제"옵션 (예 : DEL / 0x7f)을 구현하지 않는 한 난처합니다.
Peter K.

8

설명하기 너무 어렵지 않습니다 hello worl. 이것은를 입력하고 , 왼쪽 화살표 키를 두 번 누르고,를 입력 d하고, 아래쪽 화살표 키를 누르는 것과 같습니다.

적어도 그것은 당신의 터미널이 \b\n코드를 방해하고 있다고 추론하는 방법 입니다.

출력을 파일로 리디렉션하면 완전히 다른 것을 얻을 수 있습니다. 차이를 확인하기 위해 파일의 바이트를 살펴 봐야 할 수도 있습니다.

[편집하다]

좀 더 자세히 설명하면 다음과 printf같은 일련의 바이트를 내 보냅니다. hello worl^H^Hd^J여기서는 ^HASCII 문자 # 8이고 ^JASCII 문자 # 10입니다. 화면에 표시되는 내용은 터미널이 이러한 제어 코드를 해석하는 방법에 따라 다릅니다.


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.