कैसे एक चार सरणी खाली करने के लिए?


86

चार सदस्यों की तरह वर्णों की एक सरणी रखें [255]। लूप का उपयोग किए बिना मैं इसे पूरी तरह से कैसे खाली कर सकता हूं?

"खाली" से मेरा मतलब है कि अगर इसमें कुछ मूल्य संचित थे तो यह नहीं होना चाहिए। उदाहरण के लिए अगर मैं स्ट्रैस करता हूं तो पुराना मूल्य नहीं रहना चाहिए


3
आपका क्या मतलब है "खाली एक सरणी"?
पीएमजी

4
सदस्य [०] = सदस्य [१] = सदस्य [२] = सदस्य [३] ... = सदस्य [२५५] = ० कोई पाश नहीं;)
जॉन ला रोय

18
तो आपका "सरणी" एक विशेष प्रकार का सरणी है: यह एक है string। एक स्ट्रिंग को "खाली" करने के लिए, यह पहला तत्व है '' 0 ':members[0] = '\0';
pmg

समुदाय स्मरण के पक्ष में प्रतीत होता है। लेकिन यह है कि सबसे कुशल तरीका मेरी आवश्यकताओं को दिया?
एलेक्स ज़ेंडर

2
@ एलेक्स ज़ेंडर: "समुदाय" इस मामले में स्पष्ट रूप से गलत है। ऐसी परिस्थितियां हैं जो 'मेमसेट' के लिए कॉल करती हैं (जैसे अनधिकृत उपयोग को रोकने के लिए डेटा मिटा देना), लेकिन सरल स्ट्रिंग रीसेट (आपके मामले में) के लिए सही उत्तर केवल पहले तत्व को शून्य करना है।
चींटी

जवाबों:


173

का उपयोग करते हुए

सामान्य रूप में

यदि सरणी कार्यक्षेत्र में है, या

यदि आपके पास केवल पॉइंटर मान है, और nemembers सरणी में तत्वों की संख्या है।


निश्चित रूप से, अब आवश्यकता एक स्ट्रिंग को पूरी तरह से रीसेट करने के लिए एक सरणी को साफ़ करने के सामान्य कार्य से बदल गई है, memsetओवरकिल है और बस पहले तत्व के नुकसान को शून्य कर रहा है (जैसा कि अन्य उत्तरों में नोट किया गया है)।


EDIT मेमसेट का उपयोग करने के लिए , आपको string.h को शामिल करना होगा


6
+1 - मैं इसके लिए जाऊंगा क्योंकि यह सुनिश्चित करता है कि सभी सरणी तत्व एक ज्ञात स्थिति में हों।
क्रिसबड

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

1
जबकि पुनरावृत्ति को संभवतः पुनरावृत्ति के रूप में लागू नहीं किया जाता है, यह हो सकता है - या तो मामले में, पुनरावृत्ति को दृष्टि से छिपाया जाता है, जो कि अस्थिर आवश्यकता थी।
स्टीव गिलहम

37

'खाली' से आपका क्या अर्थ है:


3
यह केवल सदस्यों के मूल्य को बदल देगा [0], सदस्यों को नहीं [1] सदस्यों के माध्यम से [254]। ठीक है अगर आप क्रमिक रूप से पहुंच रहे हैं ... लेकिन अन्य मामलों में इतना ठीक नहीं है।
थॉमस ओवंस

3
ओपी के संपादन के बाद ऐसा लगता है कि मेरा समाधान उसकी आवश्यकताओं के लिए काम करना चाहिए, क्योंकि स्ट्रैकट () NULL बाइट को ढूंढेगा और उसके अनुसार इलाज करेगा।
फेलिक्स

3
बेहतर समाधान नहीं। बस एक अलग समस्या का हल।
ypnos

4
सी। में एक सार एरे को "खाली" करने का कोई तरीका नहीं है। हर एरे में कुछ होता है, भले ही वह शून्य हो। "सरणी खाली करना" की धारणा केवल सरणी सामग्री की उच्च-स्तरीय तार्किक व्याख्याओं पर लागू होती है। उदाहरण के लिए, सरणी की सामग्री की व्याख्या सी-स्ट्रिंग के रूप में की जा सकती है। उस स्थिति में "खाली" करने का उचित तरीका यह है कि पहले तत्व को '\ 0' में सेट किया जाए। वास्तव में फेलिक्स ने क्या किया। मुझे नहीं पता कि ओपी के मन में क्या अन्य व्याख्याएं हो सकती हैं, लेकिन इसे और अधिक विशिष्ट बनाने के बिना 'स्मरण' के साथ उन सभी प्रयासों को एक व्यर्थ प्रश्न का अर्थहीन जवाब है।
टीटी

1
@tinkertim: यहाँ कोई नल नहीं है। और नहीं, 'strcat' को पता नहीं है कि NULL को कैसे संभालना है। यदि आप इसे NULL पास करते हैं तो यह क्रैश हो जाएगा।
दोपहर

9

यदि आप तार के साथ काम कर रहे हैं तो अपने चारो शून्य को शून्य करने की कोशिश न करें। नीचे तार स्ट्रिंग्स के साथ काम करने का एक सरल तरीका है।

कॉपी करें (नया स्ट्रिंग असाइन करें):

सम्‍मिलित करें (स्ट्रिंग जोड़ें):

खाली स्ट्रिंग:

सरल जैसे की वह।


8

char के सदस्य [255] = {0};


1
नहीं, क्योंकि उन्होंने यह निर्दिष्ट नहीं किया था कि इसे शुरू करने के बाद किया जाना चाहिए। खासतौर पर इसे एडिट करने से पहले उसके पहले उदाहरण से समझा जा सकता है और क्योंकि किसी एरे को क्लियर करने के लिए यह बहुत सामान्य उपयोग का मामला है।
user44556

मैं आपको मुआवजे के रूप में +2 देता हूं - उसने आपको -1: P: D
stviper

5

संपादित करें: प्रश्न के सबसे हालिया संपादन को देखते हुए, यह अब काम नहीं करेगा क्योंकि कोई शून्य समाप्ति नहीं है - यदि आप सरणी को प्रिंट करने का प्रयास करते हैं, तो आपको अपने पात्रों को कई गैर-मानव-पठनीय वर्णों के बाद मिलेगा। हालाँकि, मैं इस उत्तर को यहाँ पोस्टिंग के लिए सामुदायिक विकि के रूप में छोड़ रहा हूँ।

वह काम करना चाहिए। सी प्रोग्रामिंग लैंग्वेज के अनुसार:

यदि सरणी का आकार निश्चित है, तो आरम्भिकों की संख्या सरणी के सदस्यों की संख्या से अधिक नहीं हो सकती है; यदि कुछ कम हैं, तो शेष सदस्यों को 0 से आरंभ किया जाता है।

इसका मतलब यह है कि सरणी के प्रत्येक तत्व का मान 0. होगा। मुझे यकीन नहीं है कि यदि आप "रिक्त" पर विचार करेंगे या नहीं, क्योंकि 0 एक के लिए एक वैध मूल्य है char


यह इस बात पर निर्भर करता है कि आप "खाली" को कैसे परिभाषित करते हैं। 0 के मान वाला चार्ट मानव-पठनीय वर्ण नहीं है और वर्णों की सरणी एक ज्ञात स्थिति में है। मैं उस खाली पर विचार करूंगा। यह भी ठीक उसी तरह से करता है जैसे कि मेमसेट (अगर मेरी याददाश्त ठीक है - यह बहुत लंबा हो चुका है क्योंकि मैंने C का उपयोग किया है)।
थॉमस ओवंस

3

आप किसी ऐरे को खाली नहीं कर सकते हैं, इसमें हमेशा समान मात्रा में डेटा होता है।

बड़े संदर्भ में सरणी में डेटा वस्तुओं की एक खाली सूची का प्रतिनिधित्व कर सकता है, लेकिन यह सरणी के अलावा परिभाषित किया जाना है। ऐसा करने के लिए सबसे आम तरीके वैध वस्तुओं की गणना (पीएमजी द्वारा उत्तर देखें) या उन्हें एक शून्य चरित्र (फेलिक्स द्वारा उत्तर) के साथ समाप्त करने के लिए तार के लिए है। अधिक जटिल तरीके भी हैं, उदाहरण के लिए एक रिंग बफर उन पदों के लिए दो सूचकांकों का उपयोग करता है जहां डेटा जोड़ा जाता है और हटाया जाता है।


3

पर्याप्त है, अपनी आवश्यकताओं को देखते हुए।

ध्यान दें कि यह बफर खाली नहीं कर रहा है। स्मृति अभी भी आबंटित है, मान्य वर्ण मान अभी भी इसमें मौजूद हो सकते हैं, और इसके बाद ।।


1
के रूप में भी लिखा जा सकता है * सदस्य = 0;
पलक

यहां तक 0कि एक वैध चरित्र है। हमें नहीं पता कि membersसी स्ट्रिंग माना जाता है या नहीं।
सैन


2

मैं साथ चलूँगा


यह वास्तव में बहुत मायने रखता है, क्योंकि ओपी एक ऑपरेशन (खाली करने) के लिए कह रहा है जो कि सी सरणी का हिस्सा नहीं है - इसलिए, आदर्श रूप से, वह एक नया डेटा संरचना लागू करेगा, और संरचना को संकेत देने का pmg का तरीका खाली है काफी अच्छा है
माइकल फोकरिसिस

नहीं, यह वास्तव में कोई मतलब नहीं है।

Kinopiko: जाहिरा तौर पर आप दृष्टिकोण समझ में नहीं आता है
ईसाई

Kinopiko: स्टारब्ले जवाब पढ़ें क्योंकि यह मेरे तर्क से बेहतर बताता है कि मैं एक टिप्पणी में समझा सकता हूं (धन्यवाद स्टारब्लू)
pmg

हम्म, यह एक दिलचस्प दृष्टिकोण है, क्या members_in_use अभी भी एक सरणी होगा? क्या मैं बाद में ए; सदस् य_न_उपस [5] = मान? क्या यह समसामयिकी के बराबर है (members_in_use, 0, 255); जैसा कि स्टीव ने कहा? यदि ऐसा है, तो एक के बजाय दूसरे का उपयोग क्यों करें?

1

"खाली एरे" द्वारा यदि आप 0 पर रीसेट का मतलब रखते हैं, तो आप बीजरो का उपयोग कर सकते हैं।

यदि आप किसी अन्य डिफ़ॉल्ट चरित्र के साथ सरणी भरना चाहते हैं तो आप मेमसेट फ़ंक्शन का उपयोग कर सकते हैं।


बेज़ेरो और मेमसेट (आमतौर पर) दोनों एक लूप का उपयोग करते हैं।
माइकल फोकरिसिस

1

सरल बेहतर है - समझ में आता है?

इस मामले में सिर्फ सदस्य [0] = 0 काम करता है। एक साधारण प्रश्न को इतना जटिल मत बनाओ।


0

अस्वीकरण: मैं आमतौर पर सी में कार्यक्रम नहीं करता हूं, इसलिए मेरे उदाहरणों में कोई सिंटैक्स गोच हो सकता है, लेकिन मुझे आशा है कि मैं जिन विचारों को व्यक्त करने की कोशिश करता हूं, वे स्पष्ट हैं।

यदि "खाली करने" का अर्थ "खाली स्ट्रिंग युक्त" है, तो आप केवल पहले सरणी आइटम को शून्य पर असाइन कर सकते हैं, जो प्रभावी रूप से एक एम्प्री स्ट्रिंग शामिल करने के लिए सरणी बनाएगा:

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

केवल स्टैटिक स्ट्रिंग्स का उपयोग करके एक उदाहरण:


0

आप निम्नलिखित निर्देश का उपयोग कर सकते हैं:

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