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.