C - raw使用printf打印字符串中的所有不可打印字符

时间:2015-10-18 03:37:29

标签: c printf

如果我有char* s并且我用printf打印它,就像这样:

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

如何强制printf打印不可打印的字符(问题以外的其他内容,我认为是默认值)?就像使用ls --literal一样,它是如何做的呢?

我知道isprint()但我不知道从那里去哪里。

1 个答案:

答案 0 :(得分: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和字符集已正确设置您正在使用的字体集包括请求的字符。如果您使用的是Windows,由于所使用的终端和字符集的变化范围更广,这将变得更加困难。您可以通过打印printf ("It is 25° outside.\n");轻松检查,如果您的终端和字体设置如上所述,尽管'°'是一个多字节字符,仍会正确打印。