perché usiamo \ r e \ b in C?

Oct 27 2020

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

4 klutt Oct 27 2020 at 06:34

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.

3 Barmar Oct 27 2020 at 06:31

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
2 paladin Oct 27 2020 at 06:34

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 */.

1 DevParzival Oct 27 2020 at 07:02

\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.

KennethPrince.P Oct 28 2020 at 11:04

\ 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.