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");
轻松检查,如果您的终端和字体设置如上所述,尽管 '°'
是一个多字节字符,但仍能正确打印。
如果我有一个 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");
轻松检查,如果您的终端和字体设置如上所述,尽管 '°'
是一个多字节字符,但仍能正确打印。