2017-03-22 131 views
0

我觀察到一些行爲,當使用printf通過格式字符串打印字符時,我無法解釋自己。 看起來,當字符是換行符('\ n')時,printf會忽略(包括)'%c'的所有內容,只是打印剩餘的部分。當通過'%c'打印換行符時,Printf部分忽略格式字符串

這裏是一個小例子(用戶輸入禁用優化):

#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(用於碼 ' - ')的輸出 「FOO-BAR」 的結果,但在輸入13('\ n ')只是打印「BAR」。這發生在gcc 6.3.1和clang 3.9.1上,在-Og和-O3優化級別上,在linux上。

如果我沒有弄錯,這應該與輸出緩衝沒有關係。

這是行爲的目的?

+6

這是因爲人物13是「回車」。所以它會覆蓋第一部分。換行符是字符10. –

+2

13是'\ r'不是'\ n' –

+0

哦,我混淆了'\ r'(13)和'\ n'(10)。所以真正的問題是爲什麼我的程序偶然發現了'\ r';我可能沒有使用文本模式來打開我的文件。 我會接受天氣風向標,如果他的評論將是一個答案。 –

回答

1

這是因爲人物13是「回車」。

之後,消息的第一部分被覆蓋。

換行字符是10.

1

this answer

\ r是回車和光標移回一樣,如果我將做 -

printf("stackoverflow\rnine") 
ninekoverflow 

意味着它已經將光標移動到「stackoverflow」的開始並覆蓋從「nine」開始的四個字符開始的四個字符。

在這種情況下,

BAR (id %i)\n 

將覆蓋 「FOO」。