2013-02-01 74 views
5

是否可以使用函数来检测非打印字符isctrl(),并使用printf和%C说明符将它们打印为'\ n'例如?是否可以使用%C说明符打印非打印字符?

或者我应该为每个控制字符编写if,例如printf("\\n") ..?

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

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

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

那么,它可能更好地使用['isprint'(HTTP:// EN .cppreference.com/w/c/string/byte/isprint)来检测可打印字符,而不是使用可能返回误报的'isctrl'(因为有非打印字符不是控制字符)。 –

+2

@nhahtdh它确实有道理 - 尽管我不觉得它有用,也就是说。 OP希望在屏幕上看到'\ n',而不是换行符......如果没有内置或其他预先存在的解决方案,我会推荐一个'switch-case'结构,它比无尽的如果 - 其他... – ppeterka

+0

@ppeterka:措辞让我有点困惑。阅读您的评论后,这是有道理的。 – nhahtdh

回答

7

为了扩大对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; 
    } 
} 
+0

只有一个问题队友,为什么检查'isprint()'当我们知道哪些字符是不可打印的字符,并将它们放在开关内? .. 只是好奇。 –

+0

@Aniket因为在7位ASCI中有32个不可打印的“字符”,所以每个人都需要一个例子。那么我们当然还有8位字符集中的其他字符,它们也有不可打印的字符。如果你想要照顾所有这些情况,那么这是一种情况。使用'isprint',你只需要有你感兴趣的不可打印字符的情况。当然,这个检查可以在'default'的情况下完成,而不是像我这样在'switch'之前完成。 –

12
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++; 
} 

这将打印非打印字符。

+0

谢谢allot @Aniket – MNY

+0

@尼尔没有问题 –

1

你可以确定非打印字符,但我不这么认为,你可以写这些字符。 您可以通过观察其ASCII值来检测特定的非打印字符。

+0

谢谢@ RakeshBurbure – MNY

+0

@尼尔:欢迎您。 :) –