[英]Is there a way to specify how many characters of a string to print out using printf()?
[英]How to make printf to print a character buffer the same way as NSLog does?
我正在使用帶有printf()
函數的跨平台庫將數據字節轉儲到控制台。 我注意到,由於某些原因,字節被轉換為它們的已解碼變體,而不是按原樣轉儲它們。 但是當我使用NSLog
函數時,輸出是正確的。
這是我的單元測試中的簡化代碼示例:
unsigned char *buff = new unsigned char[3]{ 0xff, 0xfe, 0x00};
NSLog(@"\n\n---%s---\n\n", buff);
printf("\n\n---%s---\n\n", buff);
它產生以下輸出:
2017-08-03 12:08:53.879 xctest[4725:44271]
---ˇ˛---
---\377\376---
如您所見,NSLog“正確”處理了字節0xff, 0xfe
並且只寫了兩個符號ˇ˛
而printf卻寫了\\377\\376
。
在這種情況下,如何使printf打印ˇ˛
(或其他兩個符號)?
我不在乎Unicode的正確性。 在這種情況下,我只需要printf只打印兩個符號,而不是那個\\x\\y
字符串。
順便說一句,當我在Windows上運行相同的printf
代碼時,它僅輸出兩個字符而不是\\x\\y
,因此此問題可能是* nix特定的。
NSLog
輸出是不會“按原樣”轉儲到“控制台”(在這種情況下為stderr)的輸出-它正在為兩個字節377 376
寫入四個字節313 207 313 233
。
printf
正在將字節377 376
輸出到“控制台”(在這種情況下為stdout)。
如果將代碼編譯為命令行應用程序,然后在終端管道中通過od -bc
輸出,您將看到此信息。
因此,正是Xcode的漂亮印刷產生了\\377\\376
。
如果要“按原樣”字節,則可以使用fprintf
寫入文件,或者如果不能更改代碼,則可以使用dup(2)
等捕獲發送到stdout的輸出。
或者,您可以預處理字符串以用單個字符替換不可打印的字符串。
HTH
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.