能否使用isctrl()
函数检测非打印字符,然后使用printf和%C指示符将它们打印为'\n'呢?或者是否应该为每个控制字符编写一个if语句,并使用printf("\\n")
进行打印?
好的,感谢下面所有善良的人 - 不可能,你必须特别指定每种情况。例如:
if (isctrl(char))// WRONG
printf("%c", char);
if (char == '\n')//RIGHT, or using switch.
printf("\\n");
能否使用isctrl()
函数检测非打印字符,然后使用printf和%C指示符将它们打印为'\n'呢?或者是否应该为每个控制字符编写一个if语句,并使用printf("\\n")
进行打印?
好的,感谢下面所有善良的人 - 不可能,你必须特别指定每种情况。例如:
if (isctrl(char))// WRONG
printf("%c", char);
if (char == '\n')//RIGHT, or using switch.
printf("\\n");
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++;
}
这将打印出不可打印字符。
对于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;
}
}
isprint()
呢?只是好奇。 - Aniket Ingeisprint
函数,你只需要为你感兴趣的不可打印字符添加条件语句即可。当然,检查也可以在default
语句中完成,而不是像我这样在switch
之前进行检查。 - Some programmer dude
isprint
来检测可打印字符,而不是使用isctrl
,因为可能会出现误判(因为有些非控制字符也是不可打印的)。isprint
- Some programmer dude\n
而不是换行符... 如果没有内置或其他预先存在的解决方案,我建议使用switch-case
结构,比无尽的if-else更好看... - ppeterka%C
和%c
不是同一个东西。%C
用于宽字符。你问的是哪个? - Jonathan Grynspan