2015-04-25 12 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"); 
} 

uscita è:Perché nell'output manca la lettera "D"?

A  B 
C  A 

Perché è l'ultima lettera A e non D?

+1

L'output è [in realtà diverso] (http://ideone.com/v5dRzc)? –

+0

'system()' richiede 'stdlib.h' o' cstdlib' –

+7

Si dice esplicitamente di cancellare il carattere precedente usando '\ b', come mai questa è una domanda? –

risposta

14

Tutto ciò che si ottiene cout viene emesso. È solo che un terminale interpreterà '\b' come "go back one character". Prova a reindirizzare l'output a un file ed esaminarlo con un editor (esadecimale) per verificare che tutti i caratteri (incluso '\b') siano presenti.

A prima vista, si potrebbe pensare che i terminali stampino l'output così com'è. Questo è sbagliato, però. I terminali cambiano il modo in cui si comportano ogni volta che incontrano una sequenza speciale di controllo o caratteri. Il carattere '\b' (= 0x08 = backspace) è uno di quelli. Più può essere trovato a http://ascii-table.com/ansi-escape-sequences.php. Puoi provare a stampare alcuni di questi in un terminale e vederli cambiare colore, riscrivere le righe correnti e così via e così via. In effetti, puoi usare queste sequenze e caratteri speciali per creare app complete come GUI nella riga di comando.

Nota comunque che non con tutti i programmi puoi fare affidamento sul trucco "redirect to a file" per vedere quali sequenze di controllo terminale scrivono su stdout.Molti programmi rilevano se stanno scrivendo su un terminale o no e modificano il loro uso (o la loro mancanza) delle sequenze di controllo terminale di conseguenza.

11

\b è un backspace, quindi si sposta il cursore di una posizione verso sinistra e poi si sovrascrive D con ch1 che detiene un A.

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

stampe A, una scheda, B e poi un carattere di nuova riga.

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

stampe C, una scheda, D, quindi sposta il cursore dietro D, stampe A (Ciò sovrascrive il carattere D) e poi, stampa un carattere di nuova riga.

\b è an escape sequence che rappresenta un backspace. Sposta il cursore un passo indietro.

0

A causa di \ b salto indietro e sovrascrivere D

1

Perché è l'ultima lettera A e non D?

Perché l'ultimo carattere visibile si uscita è A:

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

ch1 è A, ch3 è una nuova linea. E D non viene visualizzata perché hai cancellato con '\b'

0

A causa di questa riga nel codice // 'D' < < '\ b' < < ch1 < <, 'D' stamperà D '\ b' è backspace, quindi D viene cancellato valore di stampa ch1 che è A

1

Che questa linea cout << 'C' << '\t' << 'D' << '\b' << ch1 << ch3; fa è:

Stampa C,

fare spazio (tab \ t)

Stampa D

Torna (backspace \b)

Stampa A dove D era (D è ora cancellato)

Nuova linea (\ n)

2

Altri hanno spiegato perché D viene sovrascritto da A, perché \b è la sequenza di escape per backspace.

Mi piacerebbe aggiungere che l'output potrebbe essere diverso su macchine diverse. Come viene effettivamente visualizzato \b fino all'implementazione del terminale.

Problemi correlati