3

このコードを使用して、エスケープ文字を文字または文字列として出力しようとしています:

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

しかし、試してみると、実際にはエスケープシーケンスが出力されます。

4

4 に答える 4

12

スラッシュをエスケープして(使用" \\a")、特別に解釈されないようにします。また、ルックアップテーブルまたはswitch少なくともを使用することもできます。

switch (c) {
case '\0':
    printf("   \\0");
    break;
case '\a':
    printf("   \\a");
    break;
/* And so on. */
}
于 2011-07-13T20:10:26.280 に答える
8

文字列リテラルのバックスラッシュはエスケープする必要があります。の代わりに"\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]);
}

はい、エントリの大部分はecsNULL になります。トレードオフは、文字値を配列インデックスにマッピングすることを心配する必要がないことです。

于 2011-07-13T21:48:18.067 に答える
3

そのためには、二重のバックスラッシュを使用する必要があります。

例:

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

あなたのために働くはずです!

于 2011-07-13T20:14:27.587 に答える
0

文字 "%d" を実際に出力できるようにエスケープする場合%d:printf

printf("%%d"); 
于 2014-08-31T22:57:52.603 に答える