web-dev-qa-db-fra.com

Quelle est l'utilisation de la séquence d'échappement '\ r'?

J'ai le code C comme ceci:

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

J'ai utilisé le \r séquence d'échappement à titre d'expérience. Lorsque je lance le code, le résultat est le suivant:

o world

Pourquoi est-ce et à quoi sert-il \r exactement?

Si je lance le même code dans un compilateur en ligne, le résultat est le suivant:

Hey this is my first hello world

Pourquoi le compilateur en ligne a-t-il produit une sortie différente, ignorant le \r?

52
Ant's

\r est un retour à la ligne ; il indique à votre émulateur de terminal de déplacer le curseur au début de la ligne.

Le curseur est la position où les prochains caractères seront rendus.

Donc, en imprimant un \r permet de remplacer la ligne en cours de l'émulateur de terminal.

Tom Zych compris pourquoi le résultat de votre programme est o world tandis que le \r est en fin de ligne et vous n'imprimez rien après cela:

Lorsque votre programme se ferme, le shell imprime la commande Invite. Le terminal le restitue là où vous avez laissé le curseur. Votre programme laisse le curseur au début de la ligne, de sorte que la commande Invite remplace partiellement la ligne que vous avez imprimée. Ceci explique pourquoi vous avez vu votre invite de commande suivie de o world.

Le compilateur en ligne que vous mentionnez ne fait qu'imprimer la sortie brute dans le navigateur. Le navigateur ignore les caractères de contrôle. Le \r n'a aucun effet.

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

Voici un exemple d'utilisation de \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;
}

Il imprime à plusieurs reprises les caractères -\|/ au même endroit pour donner l’illusion d’une rotation | dans le terminal.

81
Arnaud Le Blanc

Le programme imprime "Hey this is my first hello world ", alors le curseur revient au début de la ligne. Son apparence à l'écran dépend de votre environnement. Il semble que le début de la chaîne est écrasé par quelque chose, peut-être votre invite de ligne de commande.

23
Tom Zych

Le "\ r" signifie "retour de chariot" - c'est une retenue de l'époque des machines à écrire et des imprimantes très anciennes. Le meilleur exemple est celui de Windows et d’autres systèmes d’exploitation DOSsy, où une nouvelle ligne est indiquée sous la forme "\ r\n". Voici les instructions envoyées à une ancienne imprimante pour créer une nouvelle ligne: déplacez la tête d’impression au début, puis descendez-en une.

Différents systèmes d'exploitation utiliseront d'autres séquences de nouvelle ligne. Linux et OSX utilisent simplement '\ n'. Les anciens Mac OS utilisent simplement '\ r'. Wikipedia a une liste plus complète, mais ce sont les plus importantes.

J'espère que cela t'aides!

PS: Quant à la raison pour laquelle vous obtenez cette sortie étrange ... Peut-être que la console déplace le "curseur" vers le début de la ligne, puis écrase le premier bit avec des espaces ou une somme.

8
Xavier Holt

\r déplace le curseur au début de la ligne.

Les sauts de ligne sont gérés différemment sur différents systèmes. Certains n'utilisent que \n _ (saut de ligne, par exemple Unix), certains l’utilisent (\r par exemple. Mac OS avant OS X) et certains utilisent \r\n (par exemple Windows autant que possible).

6
Nornagest

Comme Amaud576875 l'a dit, le \r séquence d'échappement signifie un retour chariot, semblable à une pression sur la touche Entrée. Cependant, je ne sais pas comment vous obtenez "o world"; vous devriez (et c'est ce que je fais) obtenir "mon premier monde bonjour", puis une nouvelle ligne. Selon le système d'exploitation que vous utilisez (j'utilise Mac), vous pouvez utiliser un \n au lieu d'une \r.

2
wchargin

C’est une technologie obsolète: l’ancienne machine à écrire à la mode. Il y avait un rouleau (Platen) qui faisait avancer le papier et une tête d'impression qui martelait une clé métallique contre un tissu encreur.

\ r Ramenez la tête d’impression sur le côté gauche.

\ n Avancez la ligne Platen.

Si le\n n'a pas été émis, vous taperiez ce qui était sur une ligne (utilisé principalement pour souligner du texte).

2
Steve Wellens

Pour répondre à la partie de votre question,

quelle est l'utilisation de \r?

De nombreux protocoles Internet, tels que FTP, HTTP et SMTP, sont spécifiés en termes de lignes délimitées par retour chariot et nouvelle ligne. Ainsi, par exemple, lors de l'envoi d'un courrier électronique, vous pourriez avoir un code tel que:

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

Ou, lorsqu'un serveur FTP répond avec une erreur d'autorisation refusée:

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

C'est très utile lorsque vous utilisez une plate-forme unix et que vous devez créer un fichier texte qui sera ouvert sur une plate-forme dos.

Unix utilise '\ n' comme terminateur de ligne et dos utilise '\ r\n' pour le terminer, vous pouvez donc l'utiliser pour créer un fichier texte dos.

1
EvilTeach