簡體   English   中英

嘗試復制有關可變參數的 printf 行為

[英]Trying to replicate printf behaviour about variadic paramenters

我試圖復制一些printf功能用於教育目的,但我遇到了一些我無法理解的printf行為。 我將嘗試用一個簡單的例子來解釋:

有這個電話:

printf(" %c %c %c", 0, 1, 2); // yes, parameters are ints not chars.

output 看起來很正常,只有 3 個空格,數字被忽略。

但是將printf output 保存到一個文件中,然后使用“ cat -e file ”來執行此操作:

 ^@ ^A ^B

^@代表 0, ^A代表 1, ^B代表 2,依此類推。

這是我的問題,這些符號是什么? 它們與價值觀有何關系?

我自己的printf也這樣做,除了 0 被視為 '\0'字符...我需要完全模仿printf所以我需要了解那里發生了什么...

我搜索了這些符號,但找不到任何東西。 它們不是 memory 垃圾,因為結果總是相同的。

cat-e選項告訴它使用特定的符號來打印不可打印的字符。 ^@代表值 0, ^A代表值 1, ^B代表值 2。這些正是您提供的值。

簡單地 cat 使用脫字符號來顯示不可打印的字符。 ^A代表1^Z代表26 ^@0

  • 27 - ^[
  • 28 - ^\
  • 29 - ^]
  • 30 - ^^
  • 31 - ^_
  • 127 - ^?

我的意思是為什么printf打印 ^@ 而我得到 '\0'(?)

printf("%c", 0); null 字符打印到stdout 查看stdout的 output 時看到的不是stdout的一部分,而是 shell/終端程序的實現細節。 打印printf()的返回值,以了解它打印了多少個字符。 也許在stderr上將它與stdout分開。

int count = printf(" %c %c %c", 0, 1, 2);
fprintf(stderr, "<%d>\n", count);

output 看起來很正常,只有 3 個空格,數字被忽略。

“似乎”值得更多的細節。 只有3個是怎么確定的?

但是把 printf output 放到一個文件中,...

文件的長度是多少? 6?

...然后使用“cat -e 文件”執行此操作:

關於為什么您現在看到“^@^A ^B”,請參閱@dbush好的答案。


我正在使用 memset 來替換字符。

不清楚,因為問題中沒有memset()

解決了。 多虧了這里的解釋,我意識到即使我正在使用 write() 打印結果字符串,我也在使用一個指針來迭代它,所以從來沒有機會實際傳遞 null 字符。

write(STDOUT_FD, delta, d_length);

然后 write() 正確地完成工作:

make test > check.txt && cat -e check.txt
own: ^@ ^A ^B$
lib: ^@ ^A ^B$

現在我也知道了插入符號,謝謝大家!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM