2013-02-01 37 views
5

Có thể sử dụng chức năng để phát hiện các ký tự không in với isctrl() và sử dụng printf với% C specifier để in chúng dưới dạng '\ n' không?Có thể in các ký tự không in bằng chỉ số% C không?

Hoặc tôi nên viết if cho mọi vi điều khiển và printf("\\n") ví dụ ..?

OK, cảm ơn Tất cả những người thuộc loại dưới đây - nó không phải là posible, bạn phải chỉ định từng tình huống. Ví dụ:

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

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

Vâng, nó có thể là tốt hơn để sử dụng [ 'isprint'] (http: // en .cppreference.com/w/c/string/byte/isprint) để phát hiện các ký tự có thể in, thay vì sử dụng 'isctrl' có thể trả về kết quả dương tính giả (vì có các ký tự không thể in không phải là ký tự điều khiển). –

+2

@nhahtdh Nó làm cho một số ý nghĩa - mặc dù tôi sẽ không tìm thấy nó hữu ích, đó là. OP muốn xem '\ n' trên màn hình thay vì ngắt dòng ... Nếu không có giải pháp đã có sẵn hoặc sẵn có khác cho điều này, tôi khuyên bạn nên tạo cấu trúc' chuyển đổi trường hợp 'cho nó, đẹp hơn nhiều so với vô tận nếu-else ... – ppeterka

+0

@ppeterka: Các từ ngữ gây nhầm lẫn cho tôi một chút ở đó. Nó có ý nghĩa sau khi đọc bình luận của bạn. – nhahtdh

Trả lời

7

Để mở rộng câu trả lời bằng cách Aniket, bạn có thể sử dụng một sự kết hợp của isprint và các giải pháp chuyển đổi-tuyên bố:

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

Chỉ cần một câu hỏi mate, tại sao kiểm tra 'isprint()' khi chúng ta biết nhân vật nào là _not_ ký tự in được, và đặt chúng bên trong switch anyway? .. chỉ tò mò thôi. –

+0

@Aniket Vì trong ASCI 7 bit có 32 ký tự không thể in được, bạn sẽ cần một trường hợp cho mỗi ký tự. Sau đó, tất nhiên chúng tôi có các ký tự khác trong bộ ký tự 8 bit, cũng có các ký tự không thể in được. Đó là một _lot_ các trường hợp nếu bạn muốn chăm sóc tất cả chúng. Sử dụng 'isprint' bạn chỉ cần có các trường hợp cho các ký tự không in được mà bạn quan tâm. Tất nhiên, việc kiểm tra có thể được thực hiện trong trường hợp' default' thay vì thực hiện nó trước 'switch' giống như tôi. –

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

này sẽ in các ký tự không thể in được.

+0

cảm ơn allot @Aniket – MNY

+0

@Nir không có vấn đề –

1

Bạn có thể xác định ký tự không in, nhưng tôi không nghĩ vậy, bạn có thể viết các ký tự đó. Bạn có thể phát hiện các ký tự không in cụ thể bằng cách quan sát giá trị ASCII của chúng.

+0

cảm ơn bạn @ RakeshBurbure – MNY

+0

@Nir: Chào mừng bạn. :) –

Các vấn đề liên quan