C में एक लंबी प्रिंटफ स्टेटमेंट को कई लाइनों में तोड़ा जा सकता है?


86

मेरे पास निम्नलिखित कथन है:

printf("name: %s\targs: %s\tvalue %d\tarraysize %d\n", sp->name, sp->args, sp->value, sp->arraysize);

मैं इसे तोड़ना चाहता हूं। मैं निम्नलिखित की कोशिश की, लेकिन यह काम नहीं करता है।

printf("name: %s\t
args: %s\t
value %d\t
arraysize %d\n", 
sp->name, 
sp->args, 
sp->value, 
sp->arraysize);

मैं इसे कैसे तोड़ सकता हूं?


1
दिए गए कुछ अच्छे सुझाव, लेकिन उनमें से कोई भी केवल चार अलग-अलग प्रिंटफ () कॉल के रूप में स्पष्ट या बनाए रखने योग्य नहीं हो सकता है।
क्लिफर्ड

@ क्लिफर्ड: तब आप C ++ लिख सकते थे इसलिए cout आपके लिए बेहतर लगता है।
टेस्ट

जवाबों:


173

यदि आप कई लाइनों पर एक स्ट्रिंग शाब्दिक रूप से तोड़ना चाहते हैं, तो आप एक साथ कई रेखाओं को एक-एक पंक्ति में बदल सकते हैं, जैसे:

printf("name: %s\t"
"args: %s\t"
"value %d\t"
"arraysize %d\n", 
sp->name, 
sp->args, 
sp->value, 
sp->arraysize);

85
कम-ज्ञात सी तथ्य की व्याख्या करने के लिए केवल टिप्पणी करना कि दो तारों के बीच व्हाट्सएप का संयोजन है।
ब्रायन पोस्टो

2
@ लुंडिन का प्रत्येक चर और इसकी अपनी रेखा पर स्पष्ट रूप से प्रतिनिधित्व किया गया मूल्य मेरे लिए पढ़ना बहुत आसान है। क्या आप एक IDE में एक डिबगर की कल्पना कर सकते हैं जो सभी चर और मानों को एक पंक्ति में रखता है? मैं नहीं कर सकता। (हां, मुझे पता है कि यह प्रत्येक स्ट्रिंग के बीच नई-लाइन वर्ण नहीं डालता है, लेकिन मैं स्रोत कोड की पठनीयता को एक डिबगर में चर की पठनीयता से तुलना कर रहा हूं)
byxor

क्या यह संघटन प्रीप्रोसेसर द्वारा बनाया गया है?
डेब्यू

21

सी कंपाइलर आसन्न स्ट्रिंग शाब्दिक को एक में गोंद कर सकता है, जैसे

printf("foo: %s "
       "bar: %d", foo, bar);

पूर्वप्रक्रमक लाइन के अंतिम चरित्र के रूप में एक बैकस्लैश का उपयोग कर सकता है, न कि सीआर (या सीआर / एलएफ, यदि आप विंडोजलैंड से हैं) की गिनती कर रहे हैं:

printf("foo %s \
bar: %d", foo, bar);

6
पहले से ही सुझाव दिया गया है, दूसरा इस तथ्य से ग्रस्त है कि यह टूट जाता है यदि '' '' के बाद कोई व्हाट्सएप हो ; एक बग जो तब होता है जब वह चकरा सकता है।
क्लिफर्ड

1
न तो उन दो उदाहरणों में सी प्रीप्रोसेसर के साथ कुछ भी करना है।
दान मोल्डिंग

@ मेरा cpp समझ में आता है / (ऊपर मेरा संपादन देखें)। मुझे यकीन नहीं है कि यह मानक व्यवहार है।
सिगाजिस

@Dan आसन्न शाब्दिक में शामिल होने पर या तो प्रीप्रोसेसर या कंपाइलर (वास्तविक संकलन से पहले अंतिम चरण में) के साथ प्रदर्शन किया जा सकता है, हैंडलिंग लाइन निरंतरता प्रीप्रोसेसर द्वारा किया जाता है, क्योंकि अन्यथा मल्टीलाइन मैक्रोज़ को लागू नहीं किया जा सकता है। यहाँ भी देखें - gcc.gnu.org/onbuildocs/cpp/Initial-processing.html
qrdl

2
@qrdl: मेरा बुरा, आप दूसरे के बारे में सही हैं। लाइन निरंतरता हमेशा प्रीप्रोसेसर द्वारा की जाती है। कभी-कभी मुझे यह याद दिलाने की आवश्यकता होती है कि मैं यह नहीं जानता कि यह सब;) मुझे अभी भी नहीं लगता कि सामान्य मामले में कंपाइलर स्ट्रिंग शाब्दिकों से जुड़ता है, हालांकि।
दान मोल्डिंग

20

बस कुछ अन्य स्वरूपण विकल्प:

printf("name: %s\targs: %s\tvalue %d\tarraysize %d\n", 
        a,        b,        c,        d);

printf("name: %s\targs: %s\tvalue %d\tarraysize %d\n", 
              a,        b,        c,            d);

printf("name: %s\t"      "args: %s\t"      "value %d\t"      "arraysize %d\n", 
        very_long_name_a, very_long_name_b, very_long_name_c, very_long_name_d);

आप विषय पर बदलाव जोड़ सकते हैं। विचार यह है कि printf()रूपांतरण spficiers और संबंधित चर सभी "अच्छी तरह" ("अच्छी तरह से" के कुछ मूल्यों के लिए) पंक्तिबद्ध हैं।


यहां कुछ भी कार्यात्मक नहीं है, लेकिन एक उपन्यास विचार जो मैंने पहले कभी नहीं देखा है। मुझे यह पसंद है, महान टिप्पणी @pmg!
आरपीजे

3

सी में जटिल कार्यों को विभाजित करने के लिए डी-फैक्टो मानक तरीका प्रति तर्क है:

printf("name: %s\targs: %s\tvalue %d\tarraysize %d\n", 
       sp->name, 
       sp->args, 
       sp->value, 
       sp->arraysize);

या अगर आप:

const char format_str[] = "name: %s\targs: %s\tvalue %d\tarraysize %d\n";
...
printf(format_str, 
       sp->name, 
       sp->args, 
       sp->value, 
       sp->arraysize);

आपको स्ट्रिंग को विभाजित नहीं करना चाहिए, न ही \सी लाइन को तोड़ने के लिए उपयोग करना चाहिए । ऐसा कोड जल्दी से पूरी तरह से अपठनीय / अप्राप्य हो जाता है।


3

मुझे नहीं लगता कि printfस्ट्रिंग स्टेटमेंट को प्रिंट करने के लिए एक कथन का उपयोग करना जैसा कि ऊपर देखा गया है, एक अच्छा प्रोग्रामिंग अभ्यास है; बल्कि, कोई नीचे दिए गए कोड का उपयोग कर सकता है:

printf("name: %s\t",sp->name);
printf("args: %s\t",sp->args);
printf("value: %s\t",sp->value);
printf("arraysize: %s\t",sp->name); 
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.