![](/img/trans.png)
[英]Trying to recreate printf's behaviour with doubles and given precisions (rounding) and have a question about handling big numbers
[英]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和
^[
^\
^]
^^
^_
^?
我的意思是為什么
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()
。
解決了。 多虧了這里的解釋,我意識到即使我正在使用 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.