2015-04-25 13 views
5
#include <iostream> 
using namespace std; 

int main() { 

    char ch1 = 'A'; 
    char ch2 = 'B'; 
    char ch3 = '\n'; 
    cout << ch1 << '\t' << ch2 << ch3; 
    cout << 'C' << '\t' << 'D' << '\b' << ch1 << ch3; 
    //return 0; 
    system("pause"); 
} 

wyjściowa wynosi:Dlaczego na wyjściu brakuje litery "D"?

A  B 
C  A 

Dlaczego jest ostatnią literą A i D nie?

+1

Twoje dane wyjściowe są [faktycznie różne] (http://ideone.com/v5dRzc)? –

+0

'system()' wymaga 'stdlib.h' lub' cstdlib' –

+7

Możesz jawnie powiedzieć, aby skasować poprzedni znak za pomocą '\ b', w jaki sposób to jest nawet pytanie? –

Odpowiedz

14

Wszystko, co otrzymasz cout. Po prostu terminal będzie interpretował '\b' jako "go back one character". Spróbuj przekierować dane wyjściowe do pliku i zbadaj je za pomocą edytora (hex), aby zobaczyć, że znajdują się tam wszystkie znaki (w tym '\b').

Na pierwszy rzut oka można by pomyśleć, że terminale drukują wydruki tak jak są. To nieprawda. Terminale zmieniają sposób, w jaki się zachowują, gdy napotykają na jedną ze specjalnych sekwencji kontrolnych lub znaków. Jednym z nich jest znak '\b' (= 0x08 = backspace). Więcej można znaleźć pod adresem http://ascii-table.com/ansi-escape-sequences.php. Możesz spróbować wydrukować niektóre z nich na terminalu i zobaczyć, jak zmienia kolory, przepisać bieżące linie i tak dalej i tak dalej. W rzeczywistości można użyć tych specjalnych sekwencji i znaków, aby utworzyć kompletne aplikacje typu GUI w wierszu polecenia.

Należy jednak zauważyć, że nie we wszystkich programach można polegać na sztuczce "redirect to a file", aby zobaczyć, jakie sekwencje kontrolne terminali zapisują na standardowe wyjście.Wiele programów wykrywa, czy piszą do terminala, czy też nie i odpowiednio dostosowują ich użycie (lub ich brak) w sekwencji sterowania terminalem.

11

\b jest Backspace, więc przesunąć kursor o jedną pozycję w lewo, a następnie zastąpić D z ch1 który posiada A.

6
cout << ch1 << '\t' << ch2 << ch3; 

drukuje A, kartę, B a następnie znak nowej linii.

cout << 'C' << '\t' << 'D' << '\b' << ch1 << ch3; 

drukuje C klapka, D, a następnie przemieszcza się kursor za D wydruki A (to zastąpienie postać D), a następnie wyświetla znak nowej linii.

\b to an escape sequence co oznacza backspace. Przesuwa kursor jeden krok w tył.

0

powodu \ b skacze z powrotem i nadpisanie D

1

Dlaczego jest ostatnią literą A i D nie?

Ponieważ ostatni widoczny znak, który wyjście jest A:

cout << 'C' << '\t' << 'D' << '\b' << ch1 << ch3; 

ch1 jest A, ch3 to nowa linia. I D nie jest wyświetlana, ponieważ usunięte go z '\b'

0

Dzięki tej linii w kodzie // 'D' < < '\ b' < < CH1 < <, 'D' będzie drukowania D '\ b' backspace, więc D zostaje wymazane ch1 drukuje wartość, która jest A

1

Co to linia cout << 'C' << '\t' << 'D' << '\b' << ch1 << ch3; robi to:

Drukuj C

zrobić miejsce (tab \ t)

Drukuj D

Wróć (Backspace \b)

Drukuj A, gdzie D było (D zostało teraz skasowane)

Nowa linia (\ n)

2

Inni wyjaśnili, dlaczego D jest nadpisywane przez A, ponieważ \b jest sekwencją specjalną dla backspace.

Chciałbym dodać, że dane wyjściowe mogą się różnić na różnych komputerach. Sposób wyświetlania numeru \b zależy od implementacji terminala.

Powiązane problemy