Was ist die Verwendung von ‘\r’ Escape-Sequenz?

Lesezeit: 5 Minuten

Benutzeravatar von Ant
Ameise

Ich habe C-Code wie folgt:

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

Ich habe die verwendet \r Fluchtsequenz als Experiment. Wenn ich den Code ausführe, bekomme ich die Ausgabe als:

o world

Warum ist das so und was nützt es \r exakt?

Wenn ich denselben Code in einem Online-Compiler ausführe, erhalte ich die Ausgabe als:

Hey this is my first hello world

Warum hat der Online-Compiler eine andere Ausgabe erzeugt und die \r?

  • Dies sollte Ihre Frage perfekt beantworten … stackoverflow.com/questions/4638552/Carriage-Return-in-c

    – arijeet

    10. September 2011 um 16:15 Uhr

Benutzeravatar von Arnaud Le Blanc
Arnaud Le Blanc

\r ist ein Wagenrücklauf Charakter; Es weist Ihren Terminal-Emulator an, den Cursor an den Anfang der Zeile zu bewegen.

Das Mauszeiger ist die Position, an der die nächsten Zeichen gerendert werden.

Drucken Sie also a \r ermöglicht das Überschreiben der aktuellen Zeile des Terminalemulators.

Tom Zych hat herausgefunden, warum die Ausgabe Ihres Programms so ist o world während \r steht am Ende der Zeile und Sie drucken danach nichts mehr:

Wenn Ihr Programm beendet wird, gibt die Shell die Eingabeaufforderung aus. Das Terminal rendert es dort, wo Sie den Cursor verlassen haben. Ihr Programm lässt den Cursor am Anfang der Zeile, sodass die Eingabeaufforderung die gedruckte Zeile teilweise überschreibt. Dies erklärt, warum Sie Ihre Eingabeaufforderung gefolgt von gesehen haben o world.

Das Online-Compiler Sie erwähnen nur die Rohausgabe an den Browser. Der Browser ignoriert Steuerzeichen, also die \r hat keine Wirkung.

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

Hier ist ein Anwendungsbeispiel von \r:

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

int main()
{
        char chars[] = {'-', '\\', '|', "https://stackoverflow.com/"};
        unsigned int i;

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

        return 0;
}

Es druckt wiederholt die Zeichen - \ | / an der gleichen Position, um die Illusion einer Drehung zu erwecken | im Endgerät.

  • kannst du das im detail sagen? move the cursor? Was es bedeutet? dann wie könnte ich da bekommen o world?

    – Ameisen

    10. September 2011 um 16:13 Uhr


  • Super 😀 das Beispielprogramm, das Sie gegeben haben, ist perfekt! +1

    – Ameisen

    10. September 2011 um 16:44 Uhr


  • könnten Sie erklären, was tut usleep tut?

    – Ameisen

    10. September 2011 um 16:45 Uhr

  • usleeps pausiert das Programm für eine bestimmte Anzahl von Mikrosekunden

    – Arnaud Le Blanc

    10. September 2011 um 16:58 Uhr

  • Du brauchst ein fflush irgendwo da drin… Und i sollte sein unsigned des Programms wird schließlich UB aufrufen, wenn es überläuft.

    – R.. GitHub HÖR AUF, EIS ZU HELFEN

    10. September 2011 um 17:10 Uhr


Das Programm druckt "Hey this is my first hello world ", dann bewegt es den Cursor zurück zum Anfang der Zeile. Wie dies auf dem Bildschirm aussieht, hängt von Ihrer Umgebung ab. Es scheint, dass der Anfang der Zeichenfolge von etwas überschrieben wird, vielleicht von Ihrer Eingabeaufforderung.

  • +1, weil Sie herausgefunden haben, dass OP den Teil über die Eingabeaufforderung weggelassen hat, der über der Ausgabe gedruckt wurde.

    – R.. GitHub HÖR AUF, EIS ZU HELFEN

    10. September 2011 um 16:18 Uhr

  • Nun, ich weiß nicht, ob es das war. Es ist nur eine vernünftige Vermutung.

    – Tom Zych

    10. September 2011 um 16:18 Uhr

Benutzeravatar von Xavier Holt
Xaver Holt

Das ‘\r’ steht für “Carriage Return” – es ist ein Überbleibsel aus der Zeit der Schreibmaschinen und ganz alten Drucker. Das beste Beispiel ist in Windows und anderen DOSsy-Betriebssystemen, wo ein Zeilenumbruch als “\r\n” angegeben wird. Dies sind die Anweisungen, die an einen alten Drucker gesendet werden, um eine neue Zeile zu beginnen: Bewegen Sie zuerst den Druckkopf zurück zum Anfang, dann gehen Sie eine nach unten.

Verschiedene Betriebssysteme verwenden andere Zeilenumbrüche. Linux und OSX verwenden einfach ‘\n’. Ältere Mac-Betriebssysteme verwenden einfach ‘\r’. Wikipedia hat eine vollständigere Liste, aber das sind die wichtigen.

Hoffe das hilft!

PS: Warum Sie diese seltsame Ausgabe erhalten … Vielleicht bewegt die Konsole den “Cursor” zurück zum Anfang der Zeile und überschreibt dann das erste Bit mit Leerzeichen oder summat.

Benutzeravatar von Nornagest
Nornagest

\r Bewegen Sie den Cursor an den Anfang der Zeile.

Zeilenumbrüche werden auf verschiedenen Systemen unterschiedlich verwaltet. Manche benutzen nur \n (Zeilenvorschub, z. B. Unix), einige verwenden (\r zB MacOS vor OS X afaik) und einige verwenden \r\n (zB Windows afaik).

Wie amaud576875 sagte, die \r Die Escape-Sequenz bedeutet einen Wagenrücklauf, ähnlich wie das Drücken der Eingabetaste. Ich bin mir jedoch nicht sicher, wie Sie “o Welt” bekommen; Sie sollten (und das tue ich) “my first hello world” und dann eine neue Zeile erhalten. Je nachdem, welches Betriebssystem Sie verwenden (ich verwende einen Mac), möchten Sie möglicherweise a verwenden \n anstelle einer \r.

  • Verwenden des im Ubuntu-Paket verfügbaren Compilers.

    – Ameisen

    10. September 2011 um 16:18 Uhr

  • Benutz einfach \n. Das \r wird auf keinem System benötigt. Dumme Systeme, die denken, dass es noch benötigt wird, fügen eine ein, wenn sie eine sehen \n.

    – David Hamm

    10. September 2011 um 16:48 Uhr


Dies ist von antiquierter Technologie: Der altmodische Schreibmaschinenstil des Druckers. Es gab eine Walze (Walze), die das Papier vorrückte, und einen Druckkopf, der einen Metallschlüssel gegen einen Tintenstoff hämmerte.

\r Bringen Sie den Druckkopf auf die linke Seite.

\n Bewegen Sie die Walze um eine Zeile weiter.

Wenn das \n nicht ausgegeben wurde, würden Sie überschreiben, was in einer Zeile stand (wird hauptsächlich zum Unterstreichen von Text verwendet).

  • Verwenden des im Ubuntu-Paket verfügbaren Compilers.

    – Ameisen

    10. September 2011 um 16:18 Uhr

  • Benutz einfach \n. Das \r wird auf keinem System benötigt. Dumme Systeme, die denken, dass es noch benötigt wird, fügen eine ein, wenn sie eine sehen \n.

    – David Hamm

    10. September 2011 um 16:48 Uhr


Benutzeravatar von Toby Speight
Toby Speight

Um den Teil Ihrer Frage zu beantworten,

wozu benutzt man \r?

Viele Internetprotokolle wie FTP, HTTP und SMTP werden in Form von Zeilen angegeben, die durch Wagenrücklauf und Zeilenumbruch getrennt sind. Wenn Sie beispielsweise eine E-Mail senden, haben Sie möglicherweise einen Code wie den folgenden:

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

Oder wenn ein FTP-Server mit einem Permission-Denied-Fehler antwortet:

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

1418270cookie-checkWas ist die Verwendung von ‘\r’ Escape-Sequenz?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy