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

C - raw print all non-printable characters in a string with printf

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

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

如何强制 printf 打印不可打印的字符(作为问号以外的字符,我认为这是默认设置)?就像如果要使用 ls --literal,它是如何做的?

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

作为从之前的评论中收集选项的简短示例,您可以使用不包含 ctype.h 的简单循环,或者使用 isprint() 检查 return 如果您这样做:

#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 能够正确打印字符串中的多字节字符 and 您使用的字体集包含请求的字符。如果您使用 windows,考虑到所使用的终端和字符集的差异较大,这会变得有点困难。您可能可以通过打印 printf ("It is 25° outside.\n"); 轻松检查,如果您的终端和字体设置如上所述,尽管 '°' 是一个多字节字符,但仍能正确打印。