it-swarm.it

A che serve la sequenza di escape "\ r"?

Ho il codice C in questo modo:

#include<stdio.h>
int main()
{
    printf("Hey this is my first hello world \r");
    return 0;
}

Ho usato il \r sequenza di escape come esperimento. Quando eseguo il codice ottengo l'output come:

o world

Perché è quello e a che serve \r Esattamente?

Se eseguo lo stesso codice in un compilatore online ottengo l'output di:

Hey this is my first hello world

Perché il compilatore online ha prodotto output diversi, ignorando \r?

52
Ant's

\r È un carattere di ritorno a capo ; indica all'emulatore di terminale di spostare il cursore all'inizio della riga.

Il cursore è la posizione in cui verranno visualizzati i caratteri successivi.

Quindi, la stampa di \r Consente di sovrascrivere la riga corrente dell'emulatore di terminale.

Tom Zych capito perché l'output del tuo programma è o world Mentre \r È alla fine della riga e non stampi nulla dopo:

Quando il programma termina, Shell stampa il comando Prompt. Il terminale lo rende dove hai lasciato il cursore. Il programma lascia il cursore all'inizio della riga, quindi il comando Prompt sostituisce parzialmente la riga stampata. Questo spiega perché hai visto il tuo prompt dei comandi seguito da o world.

Il compilatore online menzionato stampa semplicemente l'output non elaborato sul browser. Il browser ignora i caratteri di controllo, quindi \r Non ha alcun effetto.

Vedi https://en.wikipedia.org/wiki/Carriage_return

Ecco un esempio di utilizzo di \r:

#include <stdio.h>
#include <unistd.h>

int main()
{
        char chars[] = {'-', '\\', '|', '/'};
        unsigned int i;

        for (i = 0; ; ++i) {
                printf("%c\r", chars[i % sizeof(chars)]);
                fflush(stdout);
                usleep(200000);
        }

        return 0;
}

Stampa ripetutamente i caratteri -\|/ Nella stessa posizione per dare l'illusione di un | Rotante nel terminale.

81
Arnaud Le Blanc

Il programma sta stampando "Hey this is my first hello world ", quindi sposta il cursore all'inizio della riga. Come apparirà sullo schermo dipende dal tuo ambiente. Sembra che l'inizio della stringa venga sovrascritto da qualcosa, forse il prompt della riga di comando.

23
Tom Zych

"\ R" sta per "Carriage Return" - è una riserva dai tempi delle macchine da scrivere e delle stampanti davvero vecchie. Il miglior esempio è in Windows e altri sistemi operativi DOSsy, in cui una nuova riga è indicata come "\ r\n". Queste sono le istruzioni inviate a una vecchia stampante per avviare una nuova riga: spostare prima la testina di stampa all'inizio, quindi scenderne una.

Diversi sistemi operativi useranno altre sequenze di nuova riga. Linux e OSX usano semplicemente '\ n'. I vecchi Mac OS usano semplicemente '\ r'. Wikipedia ha un elenco più completo, ma quelli sono quelli importanti.

Spero che sia di aiuto!

PS: Per quanto riguarda il motivo per cui ottieni quello strano output ... Forse la console sta spostando il "cursore" all'inizio della riga e quindi sovrascrivendo il primo bit con spazi o summat.

8
Xavier Holt

\r sposta il cursore all'inizio della riga.

Le interruzioni di riga vengono gestite in modo diverso su sistemi diversi. Alcuni usano solo \n (avanzamento riga, ad esempio Unix), alcuni usi (\r per esempio. MacOS prima di OS X afaik) e alcuni usano \r\n (ad esempio Windows afaik).

6
Nornagest

Come diceva amaud576875, il \r sequenza di escape indica un ritorno a capo, simile alla pressione del tasto Invio. Tuttavia, non sono sicuro di come si ottiene "o mondo"; dovresti (e lo faccio) ottenere "il mio primo mondo di ciao" e poi una nuova linea. A seconda del sistema operativo in uso (sto usando il Mac) potresti voler utilizzare un \n anziché un \r.

2
wchargin

Questo deriva dalla tecnologia antiquata: il vecchio stile della macchina da scrivere alla moda. C'era un rullo (rullo) che faceva avanzare la carta e una testina di stampa che martellava una chiave di metallo contro un tessuto di inchiostro.

Riporta la testina di stampa sul lato sinistro.

\ n Fa avanzare il rullo di una riga.

Se il\n non è stato emesso, dovresti digitare ciò che era su una riga (usato principalmente per sottolineare il testo).

2
Steve Wellens

Per rispondere alla parte della tua domanda,

a che serve \r?

Molti protocolli Internet, come FTP, HTTP e SMTP, sono specificati in termini di linee delimitate da ritorno a capo e newline. Ad esempio, quando invii un'email, potresti avere un codice come:

fprintf(socket, "RCPT TO: %s\r\n", recipients);

Oppure, quando un server FTP risponde con un errore negato l'autorizzazione:

fprintf(client, "550 Permission denied\r\n");
2
Toby Speight

È abbastanza utile, quando si esegue sulla piattaforma unix, e è necessario creare un file di testo che verrà aperto sulla piattaforma dos.

Unix usa '\ n' come terminatore di riga e dos usa '\ r\n' come terminatore di riga, quindi puoi usarlo per creare un file di testo dos.

1
EvilTeach