2015-10-18 75 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");轻松进行检查,如果您的终端和字体如上所述进行设置,将会正确打印。