2013-07-23 7 views
17

printf() प्रलेखन का कहना है कि अगर किसी को सी में % मुद्रित करने के लिए चाहता है, वह उपयोग कर सकते हैं:सी चरित्र बैकस्लैश से बचने के लिए क्यों नहीं है?

printf("%%") 

क्यों यह नहीं है:

printf("\%") 

अन्य विशेष वर्ण के साथ के रूप में?

+1

अधिक जानकारी के लिए इस लिंक को देखें; http://publib.boulder.ibm.com/infocenter/pseries/v5r3/index.jsp?topic=/com.ibm.aix.cmds/doc/aixcmds4/printf.htm – JNL

+1

यह प्रिंटफ का तरीका है। मैं इस संदर्भ का उपयोग http://www.cplusplus.com/reference/cstdio/printf/ – GreenScape

उत्तर

28

क्योंकि %printf द्वारा संभाला जाता है। यह सी में एक विशेष चरित्र नहीं है, लेकिन printf स्वयं इसे अलग-अलग व्यवहार करता है।

35

बैकस्लैश प्रोग्राम के स्रोत पाठ की व्याख्या करते समय संकलक द्वारा संसाधित किया जाता है। तो आम परिणाम यह है कि स्रोत टेक्स्ट "\%" "%" युक्त एक स्ट्रिंग उत्पन्न करता है।

प्रारूप स्ट्रिंग का अर्थ printf दिनचर्या द्वारा किया गया है, इसलिए यह इसे पारित वर्णों को संसाधित करता है। इस समय तक, बैकस्लैश अब मौजूद नहीं है, इसलिए printf इसे कभी नहीं देखता है।

तकनीकी रूप से, \% स्ट्रिंग अक्षर में कानूनी नहीं है। चरित्र \ पलायन अनुक्रम शुरू होता है, और केवल कानूनी भागने दृश्यों सी में सूचीबद्ध कर रहे हैं 2011 6.4.4.4 1. वे हैं \ पीछा द्वारा ', ", ?, \, a, b, f, n, r, t, v , एक से तीन ऑक्टल अंक, x और हेक्साडेसिमल अंक, u और चार हेक्साडेसिमल अंक, या U और आठ हेक्साडेसिमल अंक।

तो printf ताकि एक बैकस्लैश एक प्रतिशत से बच जाएगा तैयार किया गया था, तो आप स्रोत पाठ में बैकस्लैश से बचने के द्वारा यह एक बैकस्लैश पारित करने के लिए होता है, तो आप लिखने के लिए होगा:

printf("\\%"); 
+1

+1 "x और हेक्साडेसिमल अंकों" http: // stackoverflow के सावधानीपूर्वक शब्दों के लिए करना चाहता हूं।com/प्रश्न/5784969/जब-किया-सी compilers-स्टार्ट-पर विचार-अधिक से अधिक दो हेक्स अंक में स्ट्रिंग-लाइट – chux

3

सम्मेलन यह है कि विशेष पात्र खुद से बचते हैं। तो, प्रतिशत से बचने के लिए बैकस्लैश का उपयोग करने के बजाय, यह स्वयं से बच निकलता है। (ध्यान दें कि printf पर बैकस्लैश पास करने के लिए, आपको स्ट्रिंग अक्षर को "\\%" के रूप में लिखना होगा।)

+0

के साथ प्रयोग किया सम्मेलन 'संकलक और'% 'द्वारा printf द्वारा \' यह है कि वे पात्र खुद से बचते हैं। स्ट्रिंग अक्षर और चरित्र के भीतर सम्मेलन यह है कि बैकस्लैश का उपयोग अंतिम डिलीमीटर से बचने के लिए किया जाता है। निजी तौर पर, मुझे विश्वास है कि बचने वाले चरित्र के बचने का प्रतिनिधित्व करना सबसे अच्छा है, उस चरित्र के बाद एक विशेष * कुछ और *; और पलायन कि अन्य बातों की तरह लग रहे होने से बचने के लिए, लेकिन भागने पात्रों को दोगुना करने और पलायन के साथ उद्धरण जैसी चीजों के पूर्ववर्ती के विचार (बजाय उदा का उपयोग कर '\ q' एक भाग निकले उद्धरण) बहुत आम है। – supercat

+0

स्ट्रिंग और चरित्र शाब्दिक यह भी लागू होता है, बैकस्लैश metacharacter है और यह अपने आप निकल जाता है; उद्धरण पात्र अधिकांश भाषाओं में खुद से बच नहीं पाते हैं, इसके बजाय बैकस्लैश का उपयोग इसके लिए किया जाता है। मुझे लगता है कि तुम मुझसे सहमत हो? वहाँ कुछ oddball योजनाओं जहां दोगुनी उद्धरण चिह्नों शाब्दिक उद्धरण चिह्नों का प्रतिनिधित्व किया जाता है (UTR35 स्प्रिंग्स कि का एक उदाहरण के रूप में मन में है, और यह एक वास्तविक बुरा सपना है)। –

+0

खुद को प्रतिनिधित्व करने के लिए अक्षरों से परे दोहरीकरण, हालांकि मैं लोकप्रियता के अलावा यह करने के लिए किसी भी वास्तविक लाभ पता नहीं है, एक आम पैटर्न है, क्योंकि यह मतलब है एक पता नहीं कर सकते हैं कि क्या एक विशेष चरित्र से पहले पात्रों में से एक मनमाना संख्या देखने के लिए सक्षम किया जा रहा बिना मतलब है यह। के लिए भाग निकले प्रतिनिधित्व करने के बाद '\' '\!' के बारे में अस्पष्टता से बचने होगा क्या एक तार के साथ '\\\\\\\\" 'साधन [है उद्धरण एक स्ट्रिंग या नहीं का हिस्सा बच गए समाप्त करने के लिए लगता है कि? ] अन्य भाषाएं कुछ अलग दृष्टिकोणों का उपयोग करती हैं, हालांकि कभी-कभी वे अपने स्वयं के अस्पष्टता उत्पन्न करते हैं (जैसे .NET प्रारूप तार)। – supercat

0

आप इसे कर सकते हैं !!!!!

#include <iostream> 
#include <string> 
#include "stdio.h" 
using namespace std; 



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


    printf("hhhhhhh %s \n","\%"); 
    printf("hhhhhhh \n"); 

    return 0; 
} 

समस्या printf के साथ मौजूद हैं और संकलक आप उपयोग .. wxWidget के साथ से अलग lib आप दो भागने दृश्यों

printf(" xxxxxx \0x81 xx \0x82 xx \n"); 

डॉन टी जाना साथ printf का उपयोग नहीं कर सकते। लेकिन यदि आप

printf(" xxxxxx %s xx %s \n","\0x81","\0x82"); 

का उपयोग करते हैं तो आप सही हैं। एक प्लस

संबंधित मुद्दे

 संबंधित मुद्दे