使用 %C 格式说明符是否可能打印非打印字符?

8

能否使用isctrl()函数检测非打印字符,然后使用printf和%C指示符将它们打印为'\n'呢?或者是否应该为每个控制字符编写一个if语句,并使用printf("\\n")进行打印?

好的,感谢下面所有善良的人 - 不可能,你必须特别指定每种情况。例如:

if (isctrl(char))// WRONG
 printf("%c", char);

if (char == '\n')//RIGHT, or using switch. 
 printf("\\n");

7
最好使用isprint来检测可打印字符,而不是使用isctrl,因为可能会出现误判(因为有些非控制字符也是不可打印的)。isprint - Some programmer dude
2
@nhahtdh 这确实有些道理 - 尽管我不认为它有用。 OP想要在屏幕上看到\n而不是换行符... 如果没有内置或其他预先存在的解决方案,我建议使用switch-case结构,比无尽的if-else更好看... - ppeterka
@ppeterka:那里的措辞有点让我困惑。读了你的评论后才明白它的意思。 - nhahtdh
1
请注意,%C%c不是同一个东西。%C用于宽字符。你问的是哪个? - Jonathan Grynspan
非常感谢您的帮助。我已经编辑了问题并得出了结论。如果我有错,请纠正我,@ppeterka。 - MNY
显示剩余2条评论
3个回答

11
const char *pstr = "this \t has \v control \n characters";
char *str = pstr;
while(*str){
   switch(*str){
     case '\v': printf("\\v");break;
     case '\n': printf("\\n"); break;
     case '\t': printf("\\t"); break;
     ...
     default: putchar(*str);break;
   }
   str++;
}

这将打印出不可打印字符。


10

对于Aniket的回答,你可以使用isprint和switch语句方法相结合:

char ch = ...;

if (isprint(ch))
    fputc(ch, stdout);  /* Printable character, print it directly */
else
{
    switch (ch)
    {
    case '\n':
        printf("\\n");
        break;

    ...

    default:
        /* A character we don't know, print it's hexadecimal value */
        printf("\\x%02x", ch);
        break;
    }
}

兄弟,只有一个问题,既然我们知道哪些字符是不可打印的,并且无论如何都将它们放在 switch 语句中,为什么还要检查 isprint() 呢?只是好奇。 - Aniket Inge
@Aniket 因为在7位ASCII中有32个不可打印的“字符”,你需要为每一个字符都加一个条件语句。当然,我们还有8位字符集中的其他字符,其中也包含不可打印的字符。如果你想要处理所有这些情况,那就是非常多的条件语句。使用isprint函数,你只需要为你感兴趣的不可打印字符添加条件语句即可。当然,检查也可以在default语句中完成,而不是像我这样在switch之前进行检查。 - Some programmer dude

1
你可以确定非打印字符,但我认为你无法写出这些字符。你可以通过观察它们的ASCII值来检测特定的非打印字符。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接