2011-07-13 13 views
1

私はこのコードを使用して文字または文字列として文字をエスケープ印刷しようとしている:エスケープ文字を文字として印刷するにはどうすればよいですか?

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

が、私はそれをしようとすると、それは実際にエスケープシーケンスを出力します。

+3

使用ダブルスラッシュを '\\' –

答えて

11

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

switch (c) { 
case '\0': 
    printf(" \\0"); 
    break; 
case '\a': 
    printf(" \\a"); 
    break; 
/* And so on. */ 
} 
+1

あなたは\\「( 'printfのを意味するものではありません。 0 ");など? – Praetorian

+0

@Praetorian Yup :))私はコピー貼り付け、ありがとう:-) – cnicutar

+0

助けてくれてありがとう – user798774

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

はあなたのために働く必要があります!

4

文字列リテラルのバックスラッシュをエスケープする必要があります。 "\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のエントリの大半はNULLであることを行っています。私はキャラクタ値を配列インデックスにマッピングすることについて心配する必要がないというトレードオフです。あなたが実際に文字を印刷できるようにするために、 "%d" がprintf%dをエスケープしたい場合

0

printf("%%d"); 
関連する問題