C के प्रिंटफ में% (प्रतिशत) चिन्ह से कैसे बच सकते हैं?


274

printfC का उपयोग करते समय आप% चिन्ह से कैसे बचेंगे ?

printf("hello\%"); /* not like this */

जवाबों:


421

आप इस तरह दोहरा '%' पोस्ट करके बच सकते हैं: %%

अपने उदाहरण का उपयोग करना:

printf("hello%%");

'%' चिह्न बचाना केवल प्रिंटफ के लिए है। यदि तुम करो:

char a[5];
strcpy(a, "%%");
printf("This is a's value: %s\n", a);

यह प्रिंट होगा: This is a's value: %%


8
"printf (" हैलो %% ");" सही है। लेकिन मुझे लगता है कि यह पलायन नहीं है। प्रिंटफ का उपयोग करें ("हैलो \ 045");
लाई जियांगशान

1
@ पाब्लो सांता क्रूज़: "भागने" की यह विधि %विशिष्ट है printf, सही है?
लेज़र

10
बचने की प्रणालियों में यह बहुत ही सामान्य नियम है कि शाब्दिक बच के प्रतीक को प्राप्त करने के लिए आप <भागने के प्रतीक> <भागने के प्रतीक> का उपयोग करते हैं।
dmckee --- पूर्व-संचालक ने

12
लाइ जियांगशान, यह काम नहीं करेगा। \045संकलन-समय बच रहा है जो भाषा का हिस्सा है और %संकलित होने पर बदल जाएगा । printfएक रन-टाइम फ़ंक्शन है, इसलिए यह आपके स्ट्रिंग के बाइट्स से निपटता है, सी सोर्स कोड के साथ नहीं, और इसके अपने एस्केप सीक्वेंस हैं जो फ़ंक्शन के कुछ भाग हैं । संक्षेप में, printfएक "भाषा के अंदर भाषा" है, और printf("This is a's value: %s\n", a);जैसा परिणाम देता है printf("This is a's value: \045\0163\012", a);
त्रिकोणीय 3

5
इसके अलावा, आप यह कर सकते हैं printf("hello%c", '%');:। हालाँकि, %%बेहतर है क्योंकि यह दूसरे तर्क का उपयोग नहीं करता है।
त्रिकोणीय 3

36

जैसा कि अन्य लोगों ने कहा है, %%% से बच जाएगा।

हालाँकि, ध्यान दें कि आपको ऐसा कभी नहीं करना चाहिए:

char c[100];
char *c2;
...
printf(c); /* OR */
printf(c2);

जब भी आपको कोई स्ट्रिंग प्रिंट करनी हो, हमेशा, हमेशा, हमेशा इसका उपयोग करके प्रिंट करें

printf("%s", c)

समस्याओं के कारण से एक अंतर्निहित% को रोकने के लिए [स्मृति उल्लंघन, segfault, आदि]


चेतावनी आम तौर पर उपयुक्त होती है लेकिन ऐसी स्थितियां हो सकती हैं जिनमें आप "यह" करना चाहते हैं - जब तक आप जानते हैं कि आपके द्वारा प्रदान की जाने वाली स्ट्रिंग को प्रारूप स्ट्रिंग के रूप में व्याख्या की जाएगी।
पीपी।

2
मैं एक बार वैकल्पिक समाधान के साथ आया था - बफर को दूसरे बफर में कॉपी करें और फिर% संकेतों को दोगुना करके इसे पार करें। मैं अंततः इस विचार के साथ आया और एक पंक्ति के साथ 20-30 लाइन फ़ंक्शन को प्रतिस्थापित किया। चिंता मत करो, मैं अपने आप को सिर के बारे में बुरी तरह से हरा दिया, जैसा कि मैं हकदार था।
ग्रीम पेरो डिक्

सच है, लेकिन यह मत भूलो कि 99% समय जब आपको एक प्रारूप स्ट्रिंग मिलती है, तो आपको va_list के रूप में तर्क मिलते हैं, इसलिए आपको vprintf का उपयोग करने की आवश्यकता होती है। इस प्रकार, मैं तकनीकी रूप से सही हूं;)
मीकैड डे

2
पुट (c) करना इतना आसान है। यदि
विलियम पर्ससेल

1
एप्स एक नई रूपरेखा प्रस्तुत करता है। यह अक्सर अवांछित व्यवहार है।
मिकेग

33

यदि स्ट्रिंग में कोई प्रारूप नहीं हैं, तो आप उपयोग कर सकते हैं puts(या fputs):

puts("hello%");

यदि स्ट्रिंग में एक प्रारूप है:

printf("%.2f%%", 53.2);

जैसा कि टिप्पणियों में कहा गया है, उत्पादन में putsएक जोड़ता है \nऔर fputsनहीं करता है।


4
विवादों का उल्लेख करना () भी, क्योंकि यह प्रत्यक्ष रूप से fprintf () को प्राप्त होता है।
टिम पोस्ट

1
पुट भी एक नईलाइन जोड़ता है [भले ही आपके पास पहले से ही एक हो]। यदि आप चाहते हैं कि, महान। नहीं तो ...
10

@ सीनन: मुझे याद दिलाने के लिए धन्यवाद puts। मैंने कभी putsस्ट्रिंग के मुद्रण के लिए नहीं सोचा और सीधे कूद गया printf। अब और नहीं।
लेज़र


7

नाइटपिक:
आप वास्तव %में उस स्ट्रिंग से बच नहीं सकते हैं जो फ़ंक्शन के printf()(और scanf()) परिवार के लिए प्रारूप निर्दिष्ट करता है।

%, में printf()(और scanf()) कार्यों का परिवार, एक रूपांतरण विनिर्देश शुरू होता है। रूपांतरण विनिर्देशन के नियमों में से एक में कहा गया है कि रूपांतरण विनिर्देशक के %रूप में (तुरंत %उस रूपांतरण विनिर्देश को शुरू करने के बाद) एक '%'चरित्र को बिना किसी तर्क के लिखे जाने का कारण बनता है ।

स्ट्रिंग में वास्तव में 2 '%'अक्षर हैं (जैसा कि भागने वाले वर्णों के विपरीत: "a\bc"3 गैर-अशक्त वर्णों "a%%b"वाला एक स्ट्रिंग है ; 4 गैर-शून्य वर्णों वाला एक स्ट्रिंग है)।


2
techinically, यह अभी भी "बच रहा है"; ऐसे चरित्र जो अपने विशेष अर्थ "बच" और अपने "चरित्र स्वभाव" पर वापस आने के लिए एक रास्ते की जरूरत है
शिनटेकेज़ो



3

C में बैकस्लैश का उपयोग स्ट्रिंग्स में वर्णों से बचने के लिए किया जाता है। स्ट्रिंग्स एक विशेष चरित्र के रूप में% को नहीं पहचानेंगे, और इसलिए कोई भी आवश्यक नहीं होगा। Printf एक और मामला है: एक% प्रिंट करने के लिए %% का उपयोग करें।



3

आप गलत प्रारूप निर्दिष्ट का उपयोग कर रहे हैं जिसे आपको %%मुद्रण के लिए उपयोग करना चाहिए %। आपका कोड होना चाहिए:

printf("hello%%");  

सी में उपयोग किए जाने वाले सभी अधिक प्रारूप विनिर्देशक पढ़ें ।




1

डबल '%' भी ".Format (…) में काम करता है। उदाहरण (iDrawApertureMask == 87, fCornerRadMask == 0.05 के साथ): सीएससी csCurrentLine.Format("\%ADD%2d%C,%6.4f*\%",iDrawApertureMask,fCornerRadMask) ; में वांछित और अपेक्षित मूल्य (स्ट्रिंग सामग्री आदि) देता है;"% ADD87C, 0.0500 *% "

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.