0
如果我有一個char* s
,我用的printf打印出來,像這樣:Ç - 原始打印字符串中的所有非打印字符的printf
printf("%s\n", s);
我怎麼能強迫printf
打印非可打印的字符(除了問號以外,我認爲是默認的)?就像一個人使用ls --literal
一樣,它是如何做的呢?
我知道isprint()
但我不知道該從哪裏出發。
如果我有一個char* s
,我用的printf打印出來,像這樣:Ç - 原始打印字符串中的所有非打印字符的printf
printf("%s\n", s);
我怎麼能強迫printf
打印非可打印的字符(除了問號以外,我認爲是默認的)?就像一個人使用ls --literal
一樣,它是如何做的呢?
我知道isprint()
但我不知道該從哪裏出發。
作爲短例如,從評論較早收集你的選擇,你可以使用一個簡單的循環,而不包括ctype.h
或使用isprint()
檢查返回如果你這樣做:
#include <stdio.h>
#include <ctype.h>
int main (void) {
char s[] = "some string w/non-printables";
char *p = s;
char sub = '*';
/* without including <ctype.h> */
for (; *p; p++)
if (*p < ' ' || *p > '~')
*p = sub;
p = s;
/* including <ctype.h> */
for (; *p; p++)
if (isprint(*p) == 0)
*p = sub;
printf ("%s\n", s);
return 0;
}
簡單地替換星號'*'
如果遇到不可打印的字符。
注:printf
能夠在一個字符串正確打印多字節字符,如果你LOCALE
和字符集設置正確和設定您所使用的字體包括所要求的字符。如果您使用的是窗口,考慮到所使用的終端和字符集的更大變化,這會變得更加困難。如果'°'
是多字節字符,您可以通過打印printf ("It is 25° outside.\n");
輕鬆進行檢查,如果您的終端和字體如上所述進行設置,將會正確打印。
你不能,你必須使用一個循環。 –
最簡單的解決方案是在將's'發送到'printf'之前解析's',並檢查每個字符是否爲'< 0x20' or '> 0x7e'(小於'〜的空格'大於'''')並且在他們的位置手動替換可接受的字符。 –
迭代你的字符串,調用['isprint'](http://en.cppreference.com/w/c/string/byte/isprint)來查看char是否可打印。如果不是,請替換您自己的符號。 –