2017-03-22 2 views
0

Ich beobachtete etwas Verhalten, das ich mir nicht erklären kann, wenn ich printf verwende, um ein Zeichen über Format-String zu drucken. Es scheint, dass, wenn das Zeichen newline ('\ n') ist, der printf ignoriert alles bis zu (einschließlich) '% c' und nur den verbleibenden Teil druckt.Printf ignoriert teilweise Formatzeichenfolge beim Drucken von Zeilenumbruch über '% c'

Hier ist ein minimal Beispiel (Benutzereingabe Optimierung deaktivieren):

#include <stdio.h> 
int main(){ 
    int c;  
    scanf("%d", &c); //read char by ascii id 
    printf("FOO%cBAR (id %i)\n", c,c); 
    return 0; 
} 

45 eingeben (der Code für die '-') resultiert in der Ausgabe "foo-BAR", aber 13 ('\ n Eingabe ') druckt nur "BAR". Dies geschieht sowohl in gcc 6.3.1 als auch in clang 3.9.1, auf -Og- und -O3-Optimierungsebenen, auf einem Linux.

Dies sollte nicht mit der Ausgangspufferung verbunden sein, wenn ich mich nicht irre.

Ist dieses Verhalten beabsichtigt?

+6

Das ist, weil Zeichen 13 "Wagenrücklauf" ist. Es überschreibt also den ersten Teil. Newline ist Character 10. –

+2

13 ist '\ r' nicht' \ n' –

+0

Oh, ich habe '\ r' (13) und '\ n' (10) verwechselt. Die eigentliche Frage ist also, warum mein Programm über ein '\ r' gestolpert ist; Ich habe möglicherweise nicht den Textmodus verwendet, um meine Datei zu öffnen. Ich würde Wetterfahne akzeptieren, wenn sein Kommentar eine Antwort wäre. –

Antwort

1

Das ist, weil Zeichen 13 "Wagenrücklauf" ist.

Danach wird der erste Teil der Nachricht überschrieben.

Newline ist Charakter 10.

1

Von this answer:

\ r Wagenrücklauf ist, und bewegt den Cursor zurück, wie wenn i

printf("stackoverflow\rnine") 
ninekoverflow 

do- wird, bedeutet er den Cursor auf verschoben der Anfang von "stackoverflow" und überschreibt die ersten vier Zeichen, da "nine" vier Zeichen lang ist.

In diesem Fall

BAR (id %i)\n 

wird "FOO" überschreiben.

Verwandte Themen