2015-10-18 108 views
0

如果我有一個char* s,我用的printf打印出來,像這樣:Ç - 原始打印字符串中的所有非打印字符的printf

printf("%s\n", s); 

我怎麼能強迫printf打印非可打印的字符(除了問號以外,我認爲是默認的)?就像一個人使用ls --literal一樣,它是如何做的呢?

我知道isprint()但我不知道該從哪裏出發。

+0

你不能,你必須使用一個循環。 –

+0

最簡單的解決方案是在將's'發送到'printf'之前解析's',並檢查每個字符是否爲'< 0x20' or '> 0x7e'(小於'〜的空格'大於'''')並且在他們的位置手動替換可接受的字符。 –

+0

迭代你的字符串,調用['isprint'](http://en.cppreference.com/w/c/string/byte/isprint)來查看char是否可打印。如果不是,請替換您自己的符號。 –

回答

1

作爲短例如,從評論較早收集你的選擇,你可以使用一個簡單的循環,而不包括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");輕鬆進行檢查,如果您的終端和字體如上所述進行設置,將會正確打印。