perché usiamo \ r e \ b in C?
Perché usiamo \ r e \ b in C? So che \ b trasforma "ciao \ bworld" in "inferno". ma possiamo semplicemente scrivere "hellworld" invece di "hello \ bworld". Allora, a che scopo serve in un programma? Questa domanda descrive cosa \ b fa Uso di \ be \ r in C , ma non chiarisce il motivo per cui viene utilizzato.
Risposte
In larga misura sono solo ragioni storiche. Molti personaggi possono effettivamente essere ricondotti a macchine da scrivere analogiche! In passato, avevi computer con stampanti a matrice invece di monitor. A quei tempi, il carattere in grassetto veniva ottenuto stampando qualcosa due volte nella stessa posizione.
Ad esempio, in Linux usiamo il carattere \nper una nuova riga, ma in Windows è \r\ncosì che cosa sono quei caratteri? Well \n(newline) serve per spostare la testa della macchina da scrivere di una riga verso il basso ed \rè il ritorno a capo , che riporta il carrello della macchina da scrivere all'inizio della riga.
Molti di questi personaggi non sono più usati molto. Sono per lo più considerati eredità. Non sono poi così utili nella programmazione moderna. Puoi usare \bper tornare indietro e sovrascrivere cose che hai scritto in precedenza, ma oggi useresti librerie come ncurses per ottenere la stessa cosa. Ai vecchi tempi, potresti effettivamente usarli per ottenere un posizionamento abbastanza esatto delle cose, ma sui moderni emulatori di terminale, non è più così. Ad esempio, i vecchi terminali avevano dimensioni fisse. Le dimensioni potrebbero non essere state standardizzate, ma non sono cambiate durante il runtime ed erano le stesse per la stessa macchina ogni volta che si esegue un programma.
Potrei prendere in considerazione l'utilizzo \be \rse volessi scrivere un'applicazione CLI con una sorta di barra di avanzamento. Esempio:
#include <stdio.h>
#include <unistd.h>
int main(void) {
int n = 0;
while(n<=100) {
printf("\rProgress: %d\%", n);
fflush(stdout);
sleep(1);
n+=10;
}
}
Potresti ottenere lo stesso risultato con \binvece di \r, ma soprattutto è più facile ristampare l'intera riga. Non riesco a vedere alcuna situazione in cui utilizzerei \bnel codice.
Una cosa simile può essere fatta se vuoi simulare la scrittura umana in un gioco basato sul testo. Ma direi che questi tipi sono principalmente per il caso in cui non hai il tempo e / o l'energia per imparare come usare metodi moderni adeguati.
Diamo un'occhiata ai primi 32 caratteri nella tabella ascii:
0 Null char
1 Start of Heading
2 Start of Text
3 End of Text
4 End of Transmission
5 Enquiry
6 Acknowledgment
7 Bell
8 Back Space
9 Horizontal Tab
10 Line Feed
11 Vertical Tab
12 Form Feed
13 Carriage Return
14 Shift Out / X-On
15 Shift In / X-Off
16 Data Line Escape
17 Device Control 1 (oft. XON)
18 Device Control 2
19 Device Control 3 (oft. XOFF)
20 Device Control 4
21 Negative Acknowledgement
22 Synchronous Idle
23 End of Transmit Block
24 Cancel
25 End of Medium
26 Substitute
27 Escape
28 File Separator
29 Group Separator
30 Record Separator
31 Unit Separator
Quasi tutti questi sono stati sostituiti da altre cose. Ad esempio da protocolli di livello superiore, come tcp e simili, ma anche da librerie come ncurses. In C, il carattere null è utile per le stringhe, ma avrebbe potuto essere risolto in altri modi, ad esempio rendendo possibile recuperare la dimensione di un array quando viene passato a una funzione.
Li usi per sovrascrivere qualcosa che hai scritto in precedenza. Normalmente non li useresti nella stessa stringa, ma in chiamate di output diverse, ad es
printf("hello");
fflush(stdout); // need to flush because we didn't write a newline
// do some stuff here
printf("\rgoodbye\n"); // This replaces hello
Quelle sequenze di escape sono utilizzate oggi principalmente per creare una sorta di CLI- "GUI", per CLI- "animazioni", come mostrare un "avanzamento del caricamento" e alcuni trucchi speciali.
In passato quelle sequenze di fuga erano usate principalmente per controllare la telescrivente e per le schede perforate.
Ad esempio, per eliminare l'ultimo carattere perforato su una scheda perforata, hai utilizzato:
putchar('\b'); putchar(127); /* DEL */.
\rviene utilizzato per spostare il cursore all'inizio della riga sopra e \nviene utilizzato per spostare il cursore all'inizio della riga successiva.
#include <stdio.h>
#include <unistd.h>
#include<iostream>
using namespace std;
int main() {
cout<<"Hello";
cout<<"\r";
cout<<"Gone ";
}
Il programma sopra non verrà visualizzato Hello.
#include <stdio.h>
#include <unistd.h>
int main() {
int i=0;
int n=4;
char pattern[n];
pattern[0]=(char)179;
pattern[1]=(char)47;
pattern[2]=(char)196;
pattern[3]=(char)92;
long long int count=0;
while(count<100000000){
printf("%c",pattern[i]);
i=(i+1)%n;
printf("\r");
count++;
}
}
Provalo da solo.
\ n "per una nuova riga" \ b "per un backspace, significa che se lo stampi, il cursore stamperà e tornerà indietro di 1 carattere. Ad esempio .... cout <<" ciao \ bHi "; stamperà" HellHi ". perché dopo aver stampato Hello, il compilatore ha trovato una \ b sequenza di escape, quindi è tornato indietro di 1 carattere (alla 'o' di Hello) e la statistica stampa Hi da o di Hello ..... quindi hai ottenuto HellHi invece di HelloHi.
"\ r" viene utilizzato per il ritorno a capo per tornare indietro di 1 riga o all'inizio della riga.
\ b = il suo scopo è backspace \ r = lo scopo è il ritorno a capo
\ r è un carattere di ritorno a capo; dice al tuo emulatore di terminale di spostare il cursore all'inizio della riga.
Il cursore è la posizione in cui verranno visualizzati i caratteri successivi.
Quindi, stampare un \ r consente di sovrascrivere la riga corrente dell'emulatore di terminale.
Mentre \ b è un carattere backspace, porta il cursore indietro di un carattere in modo che quando si digiterà la cosa successiva i caratteri davanti al cursore verranno sovrascritti.
Quindi \ b illustra il funzionamento di backspace mentre il ritorno a capo sposta semplicemente il cursore all'inizio della riga corrente.