2009-07-03 14 views
5

मैं एक प्रोग्राम लिख रहा हूं जो प्रिंट को अपने इनपुट के हेक्स डंप का उपयोग करता है। हालांकि, मैं समस्याओं में भाग रहा हूं जब न्यूलाइन, टैब इत्यादि पास हो जाते हैं और मेरे आउटपुट स्वरूपण को नष्ट कर देते हैं।एक नई लाइन के बजाय ' n' कैसे मुद्रित करें?

मैं वास्तविक न्यूलाइन प्रिंट करने के बजाय '\ n' प्रिंट करने के लिए प्रिंटफ (या अनुमान लगा सकता हूं) का उपयोग कैसे कर सकता हूं? क्या मुझे इसके लिए कुछ मैन्युअल पार्सिंग करने की ज़रूरत है?

संपादित करें: मैं अपना डेटा गतिशील रूप से प्राप्त कर रहा हूं, यह केवल \ n है कि मैं इसके बारे में नहीं हूं, बल्कि सभी प्रतीकों के बारे में हूं। उदाहरण के लिए, यह मेरा printf बयान है:

printf("%c", theChar); 

मैं इस प्रिंट \ N जब एक नई पंक्ति theChar के रूप में पारित हो जाता है कर सकते हैं, लेकिन अभी भी यह सामान्य पाठ मुद्रित जब theChar एक वैध प्रिंट करने योग्य चरित्र है? "\\n".

संपादित करें::

+1

ध्यान रखें कि printf ("% c", foo) को एकल कॉल करने का कोई तरीका नहीं है \ n, दो वर्णों की एक स्ट्रिंग आउटपुट कर सकते हैं। आपको मूल रूप से इनपुट को बदलने के बीच चयन करना होगा ("\ n" "\\ n" के साथ "\ n" को बदलना) या यदि (theChar == '\ n') एक अच्छी पुरानी शैली है। – ojrac

उत्तर

36

प्रिंट "\\ n" - "\\" उत्पन्न करता है "\" और फिर "n" को सामान्य प्रतीक के रूप में पहचाना जाता है। अधिक जानकारी के लिए here देखें।

6

आप इसे सिर्फ एक सामान्य बैकस्लैश प्रिंट बनाने के लिए बैकस्लैश बच सकते हैं हाँ आप कुछ मैनुअल पार्स करना होगा। हालांकि ऐसा करने के लिए कोड, सिर्फ एक खोज और प्रतिस्थापन होगा।

1

बस String::replace का उपयोग करने से पहले आप printf फोन हमलावर पात्रों को बदलने के लिए उपयोग करें "\\ n" (दो स्लैश)।

आप printf लपेट सकता है इस तरह कुछ करने के लिए:

void printfNeat(char* str) 
{ 
    string tidyString(str); 
    tidyString.replace("\n", "\\n"); 
    printf(tidyString); 
} 

... और बस जोड़ने अतिरिक्त अपने आप को अन्य अवांछित पात्रों में से छुटकारा बयान बदल दें।

[संपादित करें] या आप तर्कों का उपयोग करना चाहते हैं, कोशिश यह:

void printfNeat(char* str, ...) 
{ 
    va_list argList; 
    va_start(argList, msg); 

    string tidyString(str); 
    tidyString.replace("\n", "\\n"); 
    vprintf(tidyString, argList); 

    va_end(argList); 
} 
+0

यह नहीं है कि std :: basic_string :: कार्यों को प्रतिस्थापित कैसे करें। Http://en.cppreference.com/w/cpp/string/basic_string/replace से हम देखते हैं कि 'प्रतिस्थापित' स्ट्रिंग के हिस्से को प्रतिस्थापित करेगा [pos, pos + count) या [first, last) 'के साथ एक नई स्ट्रिंग यह मूल स्ट्रिंग की खोज नहीं करता है और पाए गए घटनाओं को प्रतिस्थापित करता है। – Jon

22

समारोह नीचे printchar() के रूप में "विशेष" कुछ अक्षर प्रिंट होगा, और सीमा से बाहर पात्रों के लिए अष्टाधारी कोड प्रिंट (एक ला Emacs), लेकिन अन्यथा सामान्य अक्षर मुद्रित करें। मैंने आपके आउटपुट को और अधिक पठनीय बनाने के लिए '\n' वास्तविक '\n' प्रिंट करने की स्वतंत्रता भी ली। यह भी ध्यान दें कि की पूरी श्रृंखला को फिर से चलाने में सक्षम होने के लिए main में लूप में int का उपयोग करें। आपके उपयोग में आपके पास unsigned char होगा जो आपने अपने डेटासेट से पढ़ा था।

#include <stdio.h> 

static void printchar(unsigned char theChar) { 

    switch (theChar) { 

     case '\n': 
      printf("\\n\n"); 
      break; 
     case '\r': 
      printf("\\r"); 
      break; 
     case '\t': 
      printf("\\t"); 
      break; 
     default: 
      if ((theChar < 0x20) || (theChar > 0x7f)) { 
       printf("\\%03o", (unsigned char)theChar); 
      } else { 
       printf("%c", theChar); 
      } 
     break; 
    } 
} 

int main(int argc, char** argv) { 

    int theChar; 

    (void)argc; 
    (void)argv; 

    for (theChar = 0x00; theChar <= 0xff; theChar++) { 
     printchar((unsigned char)theChar); 
    } 
    printf("\n"); 
} 
+2

+1: < 20 and > 127 पकड़ –

+3

पर अच्छा विचार <32 (या 0x20) और> = 127 होना चाहिए। इसके अलावा% o के लिए आपको कान को हस्ताक्षरित चार (या 0xff) पर डालने की आवश्यकता है क्योंकि char आमतौर पर हस्ताक्षरित होता है। – mark4o

+0

धन्यवाद @ mark4o, आप 0x20 और 32 के बारे में सही हैं। मेरा जवाब तय करें। –

5

आप यह सुनिश्चित करें कि आप किसी भी प्रिंट न हो सकने पात्रों मुद्रित नहीं है बनाना चाहते हैं, तो आप कार्यों में उपयोग कर सकते हैं ctype.hisprint की तरह:

if(isprint(theChar)) 
    printf("%c", theChar) 
else 
    switch(theChar) 
    { 
    case '\n': 
    printf("\\n"); 
    break; 
    ... repeat for other interesting control characters ... 
    default: 
    printf("\\0%hho", theChar); // print octal representation of character. 
    break; 
    } 
3

द्वारा दिए गए उदाहरणों के अलावा अन्य लोगों, आपको चरित्र वर्गीकरण कार्यों जैसे isprint() और iscntrl() पर देखना चाहिए। उन लोगों का पता लगाने के लिए उपयोग किया जा सकता है कि कौन से पात्र हैं या असीसी तालिका से हार्डकोड हेक्स मानों के बिना प्रिंट करने योग्य नहीं हैं।

3

सी/सी ++ में, '\' चरित्र बचने वाले चरित्र के रूप में आरक्षित है। इसलिए जब भी आप वास्तव में '\' प्रिंट करना चाहते हैं, तो आपको '\' दर्ज करना होगा।

समाधान 1: यह खुद ASCII मूल्य है हर प्रतीक, संख्या, वर्णमाला है

printf("\\n"); 
-2

इस प्रश्न के लिए तीन समाधान कर रहे हैं: तो वास्तविक '\ n' मूल्य आप निम्नलिखित मुद्रित होगा मुद्रित करने के लिए । ASCII मान '\' के रूप में 92 और 'n' 110 के रूप में। तत्काल मान (संख्याएं (ASCII)) दो पूर्णांक चर पर संग्रहीत हैं। मुद्रण करते समय, प्रारूप विनिर्देशक% सी (कैरेक्टर) का उपयोग किया जाता है।

void main() { 
    int i=92, j=110; 
    clrscr(); 
    printf("%c%c", i, j); 
    getch(); 
} 

अपने सी प्रोग्रामिंग सॉफ्टवेयर में इसे आजमाएं ...

समाधान 2:

कार्यक्रमों काम करता है। लेकिन मुझे लगता है यह एक, के रूप में \ N इनपुट टाइप ... यदि आप किसी अन्य \ N मिल जाएगा निष्पक्ष ... आउटपुट स्क्रीन पर नहीं है ..

void main() { 
    char a[10]; 
    gets(a); 
    printf("\n\n\n\n"); 
    puts(a); 
    getch(); 
} 

कार्यक्रमों की कोशिश करें

समाधान 3: पहले से ही ऊपर प्रयोग \ n कहा

0

सी ++ 11 के रूप में आप भी कच्चे तार

उपयोग कर सकते हैं
std::printf(R"(\\n)"); 

सब कुछके अंदरऔर )" सचमुच मुद्रित किया जाएगा। भागने के दृश्यों को संसाधित नहीं किया जाएगा।