0
如果我有一个char* s
,我用的printf打印出来,像这样:Ç - 原始打印字符串中的所有非打印字符的printf
printf("%s\n", s);
我怎么能强迫printf
打印非可打印的字符(除了问号以外,我认为是默认的)?就像一个人使用ls --literal
一样,它是如何做的呢?
我知道isprint()
但我不知道该从哪里出发。
如果我有一个char* s
,我用的printf打印出来,像这样:Ç - 原始打印字符串中的所有非打印字符的printf
printf("%s\n", s);
我怎么能强迫printf
打印非可打印的字符(除了问号以外,我认为是默认的)?就像一个人使用ls --literal
一样,它是如何做的呢?
我知道isprint()
但我不知道该从哪里出发。
作为短例如,从评论较早收集你的选择,你可以使用一个简单的循环,而不包括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");
轻松进行检查,如果您的终端和字体如上所述进行设置,将会正确打印。
你不能,你必须使用一个循环。 –
最简单的解决方案是在将's'发送到'printf'之前解析's',并检查每个字符是否为'< 0x20' or '> 0x7e'(小于'〜的空格'大于'''')并且在他们的位置手动替换可接受的字符。 –
迭代你的字符串,调用['isprint'](http://en.cppreference.com/w/c/string/byte/isprint)来查看char是否可打印。如果不是,请替换您自己的符号。 –