2016-09-13 5 views
0

Hier gibt mein Code seltsame Ergebnisse in der Online-Geeksforgeeks Compiler.printf() seltsames Ergebnis in C

#include <stdio.h> 

main() 
{ 
     printf("\nhai\bas\rha\n"); 
} 

Ausgang:haiasha

aber ich glaube, richtig Ausganghaas ist.

Online-Compiler Tinte: http://code.geeksforgeeks.org/paWwuv

Warum Compiler falsche Ausgabe geben? Bitte hilf mir.

+1

Es hängt davon ab, wie das Standardausgabegerät auf Backspace- und Return-Zeichen reagiert, nicht auf den Compiler. Die Ausgabe ist eigentlich eine Folge von Zeichen "\ n", "h", "a", "i", "b" usw. (dh 11 Zeichen), unabhängig davon, ob Sie sehen Sie alle auf dem bestimmten Ausgabegerät. – Peter

+0

'int main()'. Nur 'main()' ist nicht mehr gültig. – AnT

Antwort

2

Der Online-Compiler druckt auf eine HTML-Seite, nicht auf eine Konsole. \b wird von einem Browser anders als von einem Terminalfenster angezeigt.

Wenn Sie den Code im Online-Compiler ausführen und dann die Seitenquelle anzeigen, können Sie sehen, dass alle von Ihnen gedruckten Zeichen vorhanden sind.

1

Es ist kein Compilerfehler. Ich würde dein Terminal beschuldigen. Hier ist meine Ausgabe auf einem Debian-Rechner:

$ make so 
cc  so.c -o so 
$ ./so 

haas 

Um sicherzustellen, dass das Programm tatsächlich die charCode emittiert Sie erwarten, Sie können die Ausgabe an xxd zum Beispiel. Wenn Sie nichts zurückgeben, sollte Ihre main Funktion void sein. Wenn kein Typ-Qualifikationsmerkmal verwendet wird (was ich hässlich finde), wird int Rückgabetyp angenommen.

+0

"Wenn Sie nichts zurückgeben, sollte Ihre Hauptfunktion ungültig sein.". Das ist falsch. Der Rückgabetyp von 'main' sollte' int', nicht 'void' sein. Und es sollte explizit als "int" deklariert werden, da es in C keine "implicit int" -Regel mehr gibt. Und Sie können "nichts" von "main" zurückgeben, da der Compiler in solchen Fällen implizit "0" zurückgibt. – AnT

+0

@AnT Richtig! Ich erinnere mich an etwas im Zusammenhang mit Main in der Norm. Aber eigentlich war es mit seinen Argumenten verbunden. Haben Sie einen Hinweis darauf, dass Sie keinen impliziten Int mehr haben? – Aif

+0

Nun, wenn Sie eine Kopie von C99 öffnen, enthält es am Anfang eine Liste der wichtigsten Änderungen von C89/90. Einer der Punkte in dieser Liste erwähnt ausdrücklich die Abschaffung der "impliziten int" -Regel. Der Rest des Standardtextes wird entsprechend geändert. – AnT

1

Die „richtige“ Ausgabe in diesem Fall ist \nhai\bas\rha\n, genau wie Sie es printf geliefert, mit \n, \b und \r für die entsprechenden Sonderzeichen (oder Zeichenkombinationen) stehen.

Aber wie diese Ausgabe auf einem bestimmten Ausgabegerät aussieht, hängt von den Eigenschaften und Fähigkeiten dieses Geräts ab. Es passiert einfach, dass das von Ihrem Online-Compiler verwendete (simulierte) Ausgabegerät diese Sequenz als haiasha anzeigt.

Es scheint, dass Ihre Erwartungen auf dem Verhalten eines "typischen" Bildschirmterminals basieren. Unterdessen geben Online-Compiler nichts direkt an irgendein "Display" aus. Sie fangen die Standardausgabe ab und verarbeiten sie anschließend zur Darstellung auf einer Webseite weiter. Was Sie sehen, ist das Ergebnis dieser Nachbearbeitung.

0

\b ist ein Sonderzeichen. Die Terminals interpretieren es normalerweise als "verschiebe den Caret um ein Zeichen nach links". Als Konsequenz überschreibt das nächste gedruckte Zeichen das letzte vor \b gedruckte Zeichen.

In anderen Kontexten kann das \b Zeichen jedoch auf andere Weise interpretiert werden. Zum Beispiel ist es in einer Datei nichts anderes als ein normales Byte (mit dem Wert 8).