如何将转义字符打印为字符?

use*_*774 1 c ansi-escape fgetc

我正在尝试使用以下代码将转义字符打印为字符或字符串:

while((c = fgetc(fp))!= EOF)
{
    if(c == '\0')
    {
        printf("   \0");
    }
    else if(c == '\a')
    {
        printf("   \a");
    }
    else if(c == '\b')
    {
        printf("   \b");
    }
    else if(c == '\f')
    {
        printf("   \f");
    }
    else if(c == '\n')
    {
        printf("   \n");
    }
    else if(c == '\r')
    {
        printf("   \r");
    }
    else if(c == '\t')
    {
        printf("   \t");
    }
    else if(c == '\v')
    {
        printf("   \v");
    }
}
Run Code Online (Sandbox Code Playgroud)

但是当我尝试它时,它实际上打印了转义序列.

cni*_*tar 11

转义斜线(使用" \\a"),以便它们不会被特别解释.您也可能想要使用查找表或switch至少使用查找表.

switch (c) {
case '\0':
    printf("   \\0");
    break;
case '\a':
    printf("   \\a");
    break;
/* And so on. */
}
Run Code Online (Sandbox Code Playgroud)


Joh*_*ode 5

字符串文字中的反斜杠需要转义; 而不是"\0",你需要"\\0".

查找表可能会减少痛苦:

const char *ecs[256] = {NULL}; // assumes ASCII - may not be a valid assumption
int c;

ecs['\0'] = "\\0";
ecs['\a'] = "\\a";
ecs['\b'] = "\\b";
...
while ((c = fgetc(fp)) != EOF)
{
  if (ecs[c] == NULL)
    printf("%c", c);
  else
    printf("%s", ecs[c]);
}
Run Code Online (Sandbox Code Playgroud)

是的,大多数条目ecs都是NULL; 权衡是我不必担心将字符值映射到数组索引.