2013-02-01 19 views
5

isctrl() ile yazdırılamayan karakterleri algılamak ve% C belirteci içeren printf'i örneğin '\ n' olarak yazdırmak için bir işlev kullanmak mümkün mü?Baskı dışı karakterleri% C belirteci ile yazdırmak mümkün mü?

Ya da her kontrol için bir if yazmalı ve örneğin printf("\\n") ..?

Tamam, teşekkürler, aşağıdaki gibi olan tüm insanlar - bu mümkün değil, her durumu belirtmek zorundasınız. örnek:

if (isctrl(char))// WRONG 
printf("%c", char); 

if (char == '\n')//RIGHT, or using switch. 
printf("\\n"); 
+7

Eh, (http [isprint' '] kullanmak için daha iyi olacaktır .cppreference.com/w/c/string/byte/isprint) yazdırılabilir karakterleri algılamak için, yanlış isaretleri döndürebilen 'isctrl' kullanmak yerine (kontrol karakterleri olmayan yazdırılabilir karakterler olduğundan). –

+2

@nhahtdh Biraz anlam ifade ediyor - ancak yararlı bulamayacağımı düşünüyorum. OP, bir satır sonu yerine ekranda \ n'yi görmek istiyor ... Bunun için yerleşik bir çözüm ya da başka bir çözüm yoksa, bunun için bir 'anahtar-durum' yapısı öneririm. sonsuz if-else ... – ppeterka

+0

@ppeterka: İfadeler beni biraz karıştırdı. Yorumunuzu okuduktan sonra mantıklı. – nhahtdh

cevap

7

, sen isprint bir arada ve anahtar-ifadesi çözümü kullanabilirsiniz: // tr:

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; 
    } 
} 
+0

Sadece tek bir soru dostum, neden 'isprint() kontrol' biz hangi karakterler _not_ yazdırılabilir karakterler biliyoruz ve zaten switch içinde bunları koyduğunuzda? .. sadece merak. –

+0

@Aniket 7-bit ASCI'de 32 tane yazdırılamayan "karakter" olduğundan, her biri için bir davaya ihtiyacınız olacak. Sonra elbette, diğer karakterler de, yazdırılamayan karakterleri olan 8 bitlik karakter kümesinde var. Bunların hepsine bakmak istiyorsanız, davaların bir parçası. Benim gibi 'switch' önce sadece ilgilendiğiniz basılamaz karakterler için davaları olması gerekir isprint'' kullanma. Tabii ki, çek yapmak yerine 'default' durumda yapılabilir. –

12
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++; 
} 

bu olmayan basılabilir karakterler yazdırır.

+0

teşekkürler allot @Aniket – MNY

+0

@Nir problem yok –

1

Yazdırılmayan karakteri belirleyebilirsiniz, ancak sanmıyorum, bu karakterleri yazabilirsiniz. Belirli yazdırma dışı karakterleri ASCII değerlerini gözleyerek algılayabilirsiniz. Aniket tarafından yanıta genişletmek için

+0

Teşekkür ederiz @ RakeshBurbure – MNY

+0

@Nir: Hoş Geldiniz. :) –

İlgili konular