सी में स्ट्रिंग पैडिंग


80

मैंने यह फ़ंक्शन लिखा है जो StringPadRight ("Hello", 10, "0") -> "Hello00000" करने वाला है।

यह काम करता है लेकिन कुछ अजीब दुष्प्रभाव हैं ... कुछ अन्य चर बदल जाते हैं। मैं इसे कैसे ठीक करूं?

c  string  padding 

जवाबों:


173

यह जानना उपयोगी हो सकता है कि प्रिंटफ आपके लिए पैडिंग करता है,% -10 का उपयोग करते हुए प्रारूप स्ट्रिंग के रूप में एक क्षेत्र में वर्णों को सही ढंग से पैड करेगा 10 वर्ण लंबे

उत्पादन होगा

इस मामले में - प्रतीक का अर्थ है "वाम गठबंधन", 10 का अर्थ है "क्षेत्र में दस वर्ण" और एस का अर्थ है कि आप एक स्ट्रिंग संरेखित कर रहे हैं।

प्रिंटफ शैली प्रारूपण कई भाषाओं में उपलब्ध है और वेब पर इसके बहुत सारे संदर्भ हैं। यहाँ कई पृष्ठों में से एक है जो प्रारूपण झंडे की व्याख्या करता है। हमेशा की तरह विकीपीडिया का प्रिंटफ़ पेज भी बहुत मदद करता है (ज्यादातर इस बात का एक इतिहास सबक है कि व्यापक रूप से प्रिंटफ़ का प्रसार कैसे हुआ)।


4
क्या होगा यदि आप चाहते हैं कि स्ट्रिंग रिक्त स्थान के अलावा किसी अन्य वर्ण द्वारा गद्देदार हो? क्या इस W C का प्रिंटफ़ करने का कोई तरीका है?
पीटर अज़ताई

ऐसा नहीं लगता कि ऐसा संभव है। (कुछ गोग्लिंग किया। इसके अलावा मैन पेज के लिए printfऐसी विशेषताओं का कोई संकेत नहीं लगता है।)
विक्टर ज़मानियन

@victor - cplusplus.com/reference/clibrary/cstdio/printf - 'झंडे' खंड और 'चौड़ाई' खंड देखें।
टॉम ले ने

1
@tom - हाँ, "परिणाम रिक्त स्थानों के साथ गद्देदार है"। तो, यह संभव नहीं लगता है। जैसा कि कहा गया है, वही जानकारी मैन पेज में उपलब्ध है। इसके अलावा, भले ही printfहूबहू नहीं तो ज्यादातर एक ही व्यवहार करना चाहिए, इस है सी, सी ++ नहीं।
विक्टर ज़मानियन

1
@ विक्टर। क्षमा करें, मुझे लगा कि आप मेरे उत्तर का उत्तर दे रहे हैं, पीटर के बाद के प्रश्न का नहीं। हां, आप केवल 0 के साथ या कुछ और के साथ पैड का चयन कर सकते हैं।
टॉम लीज

42

'सी' के लिए [s] प्रिंटफ का वैकल्पिक (अधिक जटिल) उपयोग है जिसे कस्टम पैडिंग के लिए वांछित होने पर किसी भी मॉलोक () या पूर्व-स्वरूपण की आवश्यकता नहीं होती है।

यह चाल% s के लिए '*' लंबाई के विनिर्देशक (न्यूनतम और अधिकतम) का उपयोग करना है, साथ ही अधिकतम संभावित लंबाई के लिए आपके पैडिंग चरित्र से भरा एक स्ट्रिंग है।

"% *। * S" को आपके "% s" के पहले या बाद में LEFT या RIGHT पैडिंग की इच्छा के आधार पर रखा जा सकता है।

[####Monkey] <-- Left padded, "%*.*s%s"
[Monkey####] <-- Right padded, "%s%*.*s"

मैंने पाया कि PHP प्रिंटफ ( यहाँ ) % s फॉर्मेट के भीतर अपने कस्टम पैडिंग कैरेक्टर के बाद सिंगल कोटे (') का उपयोग करके एक कस्टम पैडिंग कैरेक्टर देने की क्षमता का समर्थन करता है ।
printf("[%'#10s]\n", $s); // use the custom padding character '#'
उत्पादन:
[####monkey]


ऐसा लगता है कि मैंने कुछ और पोस्ट किए गए उत्तर को यहां दोहराया है: प्रिंटफ में वेरिबल साइज पैडिंग
जे जॉर्गेन्सन

2

आपको यह सुनिश्चित करना चाहिए कि इनपुट स्ट्रिंग में सभी पेडिंग वर्ण रखने के लिए पर्याप्त स्थान है। इसे इस्तेमाल करे:

ध्यान दें कि मैंने helloस्ट्रिंग के लिए अंत में अशक्त टर्मिनेटर के लिए 11 बाइट आवंटित किए ।


1

"हैलो" पास किया गया तर्क निरंतर डेटा क्षेत्र पर है। जब तक आपने char * string को पर्याप्त मेमोरी आवंटित नहीं की है, तब तक यह अन्य वेरिएबल्स के लिए अतिरंजित है।

संपादित करें: स्टैक से निरंतर डेटा क्षेत्र में ठीक किया गया।


आप अभी भी एक स्ट्रिंग शाब्दिक गुजर रहे हैं ...: पी
जेरेमी रुटेन

आप बहुत ज्यादा नकल कर रहे हैं। हैलो प्रकार चार [6] का है, लेकिन आप इसमें से 1024 बाइट्स को कॉपी करने का प्रयास करते हैं। वह केवल विफल हो सकता है। दूसरे साइज़ोफ़ (बफर) के बजाय साइज़ोफ़ "हेलो" को पढ़ने के लिए इसे बदलें
जोहान्स स्काउब -

1
strncpy (बफर, "हैलो", आकार (बफर)); पहले से ही पूरे बफ़र को '\ 0' से भरता है, इसलिए आपकी याददाश्त () बेमानी है।
क्रिस यंग

@litb, strncpy: यदि स्रोत C स्ट्रिंग का अंत (जो एक अशक्त-वर्ण द्वारा दर्शाया गया है) मिल जाता है इससे पहले कि अंक वर्णों की प्रतिलिपि बनाई गई हो, तब तक गंतव्य शून्य से चिपका दिया जाता है जब तक कि कुल संख्या वर्णों को नहीं लिखा गया हो।
यूजीन योकोटा

@ क्रिस, बफर के बाद याद करना एक आदत है। मैं इसे वहाँ छोड़ दूँगा।
यूजीन योकोटा

1

ओह ठीक है, समझ में आता है। तो मैंने ऐसा किया:

धन्यवाद!


1

मुक्त करने के लिए मत भूलना str1
पियरे-लुई सॉवेज

1

आउटपुट:


0

फंक्शन ही मुझे ठीक लग रहा है। समस्या यह हो सकती है कि आप अपने स्ट्रिंग को पैड के लिए पर्याप्त स्थान आवंटित नहीं कर रहे हैं कि उस पर कई अक्षर। आप size_of_stringफ़ंक्शन के लिए एक तर्क पास करके भविष्य में इस समस्या से बच सकते हैं और सुनिश्चित करें कि आप स्ट्रिंग को पैड नहीं करते हैं जब लंबाई आकार से अधिक होने वाली है।


0

इस थ्रेड में मूल प्रश्न बनाने वाले फ़ंक्शन में एक चीज निश्चित रूप से गलत है, जिसे मैंने किसी का उल्लेख नहीं देखा है, वह यह है कि यह स्ट्रिंग अक्षर के अंत में अतिरिक्त वर्णों को समाप्‍त कर रहा है जिसे एक पैरामीटर के रूप में पारित किया गया है। यह अप्रत्याशित परिणाम देगा। फ़ंक्शन के उदाहरण कॉल में, स्ट्रिंग शाब्दिक "हैलो" को प्रोग्राम में हार्ड-कोड किया जाएगा, इसलिए संभवतः इसके अंत में संक्षिप्त रूप से कोड पर खतरनाक रूप से लिखना होगा। यदि आप एक स्ट्रिंग वापस करना चाहते हैं जो मूल से बड़ा है तो आपको यह सुनिश्चित करने की आवश्यकता है कि आप इसे गतिशील रूप से आवंटित करें और जब आप काम कर रहे हों तो इसे कॉलिंग कोड में हटा दें।


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