एक वर्ण सरणी को साफ़ करना c


104

मैंने सोचा कि अशक्त के लिए पहला तत्व सेट करके एक चार सरणी की संपूर्ण सामग्री को साफ़ कर दूंगा।

char my_custom_data[40] = "Hello!";
my_custom_data[0] = '\0';

हालांकि, यह केवल पहले तत्व को शून्य करने के लिए सेट करता है।

या

my_custom_data[0] = 0; 

उपयोग के बजाय memset, मुझे लगा कि ऊपर दिए गए 2 उदाहरणों से सभी डेटा को साफ़ करना चाहिए।


1
Jared, आपने c ++ टैग क्यों सेट किया? उन्होंने "C" के बारे में बात की और कोई C ++ संबंधित टैग नहीं जोड़ा।
जोहान्स शाउब -

1
यह C ++ में वर्ण सरणियों पर समान रूप से लागू होता है, भले ही उन्होंने निर्दिष्ट नहीं किया हो।
एडम हैस

4
मैंने C ++ टैग को हटा दिया है जिससे बचने के लिए हमने पहले से ही C ++ विशिष्ट समाधान पेश करने वाले लोगों के साथ देखा है
Alnitak

जवाबों:


113

यह निर्भर करता है कि आप ऐरे को कैसे देखना चाहते हैं। यदि आप सरणी को वर्णों की श्रृंखला के रूप में देख रहे हैं, तो डेटा को खाली करने का एकमात्र तरीका प्रत्येक प्रविष्टि को स्पर्श करना है। memsetसंभवतः इसे प्राप्त करने का सबसे प्रभावी तरीका है।

दूसरी ओर, यदि आप इसे C / C ++ शून्य समाप्त स्ट्रिंग के रूप में देखना चाहते हैं, तो पहली बाइट को 0 पर सेट करने से स्ट्रिंग प्रभावी रूप से साफ़ हो जाएगी।


4
उत्तर में वे मुख्य शब्द 'प्रभावी रूप से' हैं। केवल पहला तत्व 0 पर सेट किया गया है और बाकी में अभी भी अपरिभाषित मूल्य हैं लेकिन यदि आप सरणी को एक शून्य समाप्त स्ट्रिंग के रूप में मान रहे हैं और पहला तत्व शून्य है, तो स्ट्रिंग को खाली माना जाता है।
अर्नोल्ड स्पेंस

वास्तव में, यह उत्तर देने वाले लोग हैं।
जोहान्स स्काउब -

@caparcode, बिल्कुल। इसलिए यह समझना बहुत महत्वपूर्ण है कि सरणी का उपयोग कैसे किया जा रहा है।
जेयरपावर

हाँ, यही मुझे अपनी पहली पोस्ट में कहना चाहिए था। चार एक समाप्त स्ट्रिंग है। तो या तो ये चाल चलेंगे। char [0] = '\ 0'; या चार [0] = 0. मुझे यकीन नहीं है, लेकिन मैंने सुना है कि शून्य समाप्त स्ट्रिंग्स का उपयोग करने के लिए '\ 0' का उपयोग करना बेहतर है।
ant2009

@robUK, हाँ आप सही हैं। तकनीकी रूप से '\ _' 0 (ascii में) के बराबर है, लेकिन आपको '\ 0' का उपयोग करना चाहिए क्योंकि यह आपके इरादे को स्पष्ट करता है
Mark Testa

70

सी में एक सरणी सिर्फ एक स्मृति स्थान है, इसलिए वास्तव में, आपका my_custom_data[0] = '\0';असाइनमेंट पहले तत्व को शून्य पर सेट करता है और अन्य तत्वों को बरकरार रखता है।

यदि आप सरणी के सभी तत्वों को साफ़ करना चाहते हैं, तो आपको प्रत्येक तत्व पर जाना होगा। वह यह है कि memset:

memset(&arr[0], 0, sizeof(arr));

यह आम तौर पर इस बात का ध्यान रखने का सबसे तेज़ तरीका है। यदि आप C ++ का उपयोग कर सकते हैं, तो std पर विचार करें: इसके बजाय भरें:

char *begin = &arr;
char *end = begin + sizeof(arr);
std::fill(begin, end, 0);

1
मेरा मानना ​​है कि दूसरा संस्करण होना चाहिए: std :: fill (गिरफ्तारी, गिरफ्तारी + आकार (गिरफ्तारी) / आकार) (गिरफ्तारी [0]), 0);
डेविड रॉड्रिग्ज - dribeas

स्पष्टता: भरण के साथ आकार का उपयोग न करें क्योंकि आपको इंट, लॉन्ग, डबल या आपके पास क्या है, के सरणियों से बाद में परेशानी होगी।
ज़ैन लिंक्स

मैं पसंद करता हूं: std :: fill (& arrest [0], and arrest [arr_len], 0);
ज़ैन लिंक्स

ज़ैन लिंक्स, यह अपरिभाषित व्यवहार है। आप ऐसा नहीं कर सकते और गिरफ्तार नहीं कर सकते [arr_len]। लेकिन आपको एसटीडी करना है :: भरण (गिरफ्तारी, गिरफ्तारी + आकार का गिरफ्तारी, 0); या यदि आपके पास लंबाई कहीं std :: fill (गिरफ्तारी, गिरफ्तारी + arr_len, 0); चार की एक सरणी संभालने
litb - Johannes Schaub

यह केवल C में मान्य है। हालाँकि यह प्रश्न स्पष्ट रूप से C को लक्षित करता है (किसी अन्य व्यक्ति ने C ++ टैग जोड़ा है, मुझे कोई सुराग नहीं है), std :: fill दिखाता है C ++ एफिनिटी :)
जोहान्स स्काउब -

25

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

प्रारंभिक करते समय आप एक सरणी को शून्य पर सेट कर सकते हैं:

char mcd[40] = {0}; /* sets the whole array */

अन्यथा, मैं किसी भी तकनीक को याद करने के अलावा, या कुछ समान नहीं जानता।


मुझे लगता है कि यह आपके द्वारा उपयोग किए जाने वाले कंपाइलर पर निर्भर करता है
कोको

1
@ कोकोफैन: नहीं, यह कंपाइलर निर्भर नहीं है। यह भाषा विनिर्देश का हिस्सा है। कोई भी संकलक जो अलग तरह से व्यवहार करता है वह C भाषा का अनुसरण नहीं कर रहा है।
अबेलेंकी

मुझे नहीं पता था कि, धन्यवाद। मुझे ऐसा कोई संसाधन नहीं मिला जहाँ मैं इस विशेष मामले को पढ़ सकूँ। इसे बुकमार्क के रूप में रखना अच्छा होगा।
कोकोफान

1
इसे आंशिक प्रारंभ कहा जाता है। मेरे पास C99 युक्ति नहीं है, लेकिन यहां दो स्रोत हैं: bit.ly/enBC2m "आपको किसी सरणी में सभी तत्वों को प्रारंभ करने की आवश्यकता नहीं है। यदि कोई सरणी आंशिक रूप से प्रारंभ की गई है, तो जो तत्व प्रारंभ नहीं हुए हैं वे मान 0 प्राप्त करते हैं उपयुक्त प्रकार। " bit.ly/f9asHH "यदि सरणी में तत्वों की तुलना में कम आरंभीकरण हैं, तो शेष तत्व स्वचालित रूप से 0 से आरंभ किए जाते हैं"
abelenky

यह उस सरणी पर लागू नहीं होता है जिसे पहले ही घोषित किया जा चुका है और असाइन किए गए मान हैं?
स्किनकेडकंकल्स

10

उपयोग:

memset(my_custom_data, 0, sizeof(my_custom_data));

या:

memset(my_custom_data, 0, strlen(my_custom_data));

1
दूसरा विकल्प ( memset(my_custom_data, 0, strlen(my_custom_data));) केवल पहले '\ 0' को स्पष्ट करेगा, जो कि सरणी के अंत से परे हो सकता है। यह ठीक हो सकता है या नहीं।
ब्रूमनज

9

निम्नलिखित कोड का प्रयास करें:

void clean(char *var) {
    int i = 0;
    while(var[i] != '\0') {
        var[i] = '\0';
        i++;
    }
}

2
FYI करें - 4 स्थानों द्वारा कोड का इंडेंट करें या इसे चुनें और 'कोड' बटन को हिट करें, जो बाइनरी की दो लाइनों की तरह दिखता है।
meagar

यदि आप वाना को शामिल नहीं करना चाहते हैं तो उत्कृष्ट समाधान।
आकाश अग्रवाल

7

उपयोग क्यों नहीं memset()? यह कैसे करना है।

पहला तत्व सेट करना बाकी मेमोरी को अछूता छोड़ देता है, लेकिन स्ट्रिंग फ़ंक्शन डेटा को खाली मानेंगे।


1
पठनीयता पर स्मरण का उपयोग न करें: stackoverflow.com/questions/453432/…
जोहान गेर्ले

1
और आपका जवाब क्या है?
mkb

6

नीचे केस 1 और केस 2 के बाद मैंने सरणी में डेटा के साथ समझाया है, जहां नीचे पाया।

char sc_ArrData[ 100 ];
strcpy(sc_ArrData,"Hai" );

मामला एक:

sc_ArrData[0] = '\0';

परिणाम:

-   "sc_ArrData"
[0] 0 ''
[1] 97 'a'
[2] 105 'i'
[3] 0 ''

केस 2:

memset(&sc_ArrData[0], 0, sizeof(sc_ArrData));

परिणाम:

-   "sc_ArrData"
[0] 0 ''
[1] 0 ''
[2] 0 ''
[3] 0 ''

हालांकि NULL को पहला तर्क सेट करना मुश्किल होगा, लेकिन मेमसेट का उपयोग करना उचित है


4

नहीं। आप जो भी कर रहे हैं वह पहला मान '\ 0' या 0 पर सेट कर रहा है।

यदि आप अशक्त समाप्त हो चुके तारों के साथ काम कर रहे हैं, तो पहले उदाहरण में, आपको वह व्यवहार मिलेगा जो आप उम्मीद करते हैं, हालांकि स्मृति अभी भी सेट है।

यदि आप मेमरी का उपयोग किए बिना मेमोरी को खाली करना चाहते हैं, तो लूप का उपयोग करें।


मैं कहता हूं कि लूप के लिए नहीं। अपने स्वयं के "बेहतर" (और आमतौर पर नहीं) पुस्तकालय कार्यों को लिखने की कोशिश न करें। वास्तव में, विशेष रूप से डेटा संरेखण और लंबाई के बारे में जो भी जाना जाता है, उसके आधार पर सीपीयू के लिए कस्टम मशीन कोड में अक्सर विशेष रूप से इनसेट किया जाता है।
ज़ैन लिंक्स

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

यह सच है, हालांकि वह शुरुआत का उपयोग नहीं करना चाहता था, इसलिए मैंने एक लूप का सुझाव दिया।
एलन

3

आपको मेमसेट का उपयोग करना चाहिए। सिर्फ पहला तत्व सेट करने से काम नहीं चलेगा, आपको सभी तत्वों को सेट करने की आवश्यकता है - यदि नहीं, तो आप केवल पहले तत्व को 0 पर कैसे सेट कर सकते हैं?


स्मरण को पठनीयता से अधिक उपयोग नहीं किया जाना चाहिए: stackoverflow.com/questions/453432/…
जोहान गेर्ल

2

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



1

मैंने सोचा कि अशक्त के लिए पहला तत्व सेट करके एक चार सरणी की संपूर्ण सामग्री को साफ़ कर दूंगा।

यह सही नहीं है जैसा आपने खोजा है

हालांकि, यह केवल पहले तत्व को शून्य करने के लिए सेट करता है।

बिल्कुल सही!

आपको सभी डेटा को खाली करने के लिए मेमसेट का उपयोग करने की आवश्यकता है, यह प्रविष्टियों में से एक को शून्य करने के लिए पर्याप्त नहीं है।

हालाँकि, यदि सरणी के एक तत्व को शून्य करने के लिए सेट करने का मतलब कुछ विशेष है (उदाहरण के लिए, जब एक शून्य समाप्ति स्ट्रिंग का उपयोग करते हुए) तो यह पहला तत्व शून्य करने के लिए पर्याप्त हो सकता है। इस तरह से सरणी का कोई भी उपयोगकर्ता समझ जाएगा कि यह खाली है भले ही सरणी में अभी भी स्मृति में पुराने वर्ण शामिल हैं


पठनीयता से अधिक "मेमसेट" का उपयोग न करें: stackoverflow.com/questions/453432/…
जोहान गेर्ल

1

पहले तत्व को NULL पर सेट करें। चारपाइयों को प्रिंट करने से आपको कुछ भी वापस नहीं मिलेगा।



-3
void clearArray (char *input[]){
    *input = ' '; 
}

1
यह स्पष्ट नहीं है, यह केवल '' के लिए पहला चरित्र सेट कर रहा है! मुझे लगता है कि आप लिखना चाहते थे * input = '\ 0'
stviper

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