Как распечатать escape-символы как символы? - PullRequest
1 голос
/ 14 июля 2011

Я пытаюсь напечатать escape-символы в виде символов или строк, используя этот код:

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");
    }
}

, но когда я пытаюсь это сделать, он фактически печатает escape-последовательность.

Ответы [ 4 ]

11 голосов
/ 14 июля 2011

Избегайте косые черты (используйте " \\a"), чтобы они не интерпретировались специально.Также вы можете использовать справочную таблицу или, по крайней мере, switch.

switch (c) {
case '\0':
    printf("   \\0");
    break;
case '\a':
    printf("   \\a");
    break;
/* And so on. */
}
5 голосов
/ 14 июля 2011

Обратные слеши в строковых литералах необходимо экранировать;вместо "\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]);
}

Да, большинство записей в ecs будутНОЛЬ;обмен состоит в том, что мне не нужно беспокоиться о сопоставлении значения символа с индексом массива.

3 голосов
/ 14 июля 2011

Для этого нам нужно использовать двойную обратную косую черту.

Примеры:

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");
}

Должно работать на вас!

0 голосов
/ 01 сентября 2014

Если вы хотите экранировать %d в пределах printf, чтобы позволить вам фактически напечатать символы "% d":

printf("%%d"); 
...