स्ट्रैट के साथ char ** तत्व में स्थान जोड़ना

मुझे इस तरह सरणी मिली:

char *family[3] ={"son", "father", "sister"};

और मैं फंक्शन <कोड> स्ट्रैट (बेटा, ""); का उपयोग करके प्रत्येक तत्व की लंबाई को उसी आकार में संरेखित करना चाहता हूं, लेकिन मुझे कोर को इसके बजाय डंप किया गया है।

1
इसके बजाए asprintf आज़माएं।
जोड़ा लेखक zwol, स्रोत

3 उत्तर

आप strcat() को शाब्दिक तक नहीं कर सकते हैं। और उत्तरार्द्ध वह है जो तीन "तार" हैं।

साहित्य केवल पढ़ने योग्य स्मृति में रखा जाता है। उन्हें ओवरराइट नहीं किया जा सकता है, ऐसा करने का प्रयास करने से रन-टाइम त्रुटि होती है।

3
जोड़ा

strcat() appends a copy of a source string to the end of a target string, including the terminating ASCII NUL byte. The initial character of the string to append overwrites the NUL byte at the end of the target string.

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

'स्ट्रैट (परिवार [0], ""); जो आप करने की कोशिश कर रहे हैं, लेकिन वह काम नहीं करेगा क्योंकि परिवार [0] पहले से ही "बेटा \ 0 \ 0 \ 0 \ 0" पर सेट है और बफर ओवरफ़्लो का कारण बन जाएगा।

इसके बजाए ऐसा करें:

char *family[3] ={"son   ", "father", "sister"};//now family[0] is initialized with spaces to match length
                                                //(and strcat() statment is not needed)
0
जोड़ा
सच है, लेकिन पहले सही उदाहरण में, स्ट्रैट को करने की आवश्यकता नहीं है। इरादा यह दिखाने के लिए है कि यह क्यों काम करेगा, और यह क्यों काम नहीं करेगा। मैं एक टिप्पणी के साथ स्पष्ट करेंगे। धन्यवाद।
जोड़ा लेखक ryyker, स्रोत
मैं आपकी बाकी टिप्पणी, धैर्य कृपया संबोधित करने के लिए एक लाइन पर काम कर रहा हूं।
जोड़ा लेखक ryyker, स्रोत
@alk - ठीक है - और मैंने आपका बिंदु देखा, और एक और दृष्टिकोण को मनाने के लिए थोड़ा प्रयोग कर रहा था। अंत में, मैं बस सरल प्रारंभिक उदाहरण छोड़ दूंगा :) धन्यवाद (और भविष्य के लिए, जब वे मेरी गलतियों को इंगित करते हैं तो मैं डाउन-वोट का विरोध नहीं करता हूं)
जोड़ा लेखक ryyker, स्रोत
@alk ने इसे बदल दिया। (आखिरी संपादन पर इसे बाहर ले जाना चूक गया। लंबे सप्ताहांत के बाद थोड़ा जंगली :) और आपके उत्तर के लिए +1 (छोटा, सही)
जोड़ा लेखक ryyker, स्रोत
" अब उस परिवार [0] में कमरा है " एक भ्रामक तर्क है, क्योंकि char * [] उदाहरण में " कमरा " भी है आप वैसे भी देते हैं।
जोड़ा लेखक alk, स्रोत
<कोड> चार * परिवार [3] = {"बेटा \ 0 \ 0 \ 0 \ 0", ... में "कमरा" है और रिक्त स्थान के साथ गद्देदार होने की आवश्यकता है और strcat() असफल हो जाएगा। मुद्दा कुछ या पर्याप्त स्मृति ("कमरा") के बारे में नहीं है।
जोड़ा लेखक alk, स्रोत
यह मैं नहीं था! <टीएम>
जोड़ा लेखक alk, स्रोत
मुझे खेद है, लेकिन वही तर्क यहां है: " लेकिन यह काम नहीं करेगा क्योंकि परिवार [0] में केवल 4 बाइट हैं और इसकी आवश्यकता है 7। " althought यह सच है, यह नहीं है सेगमेंटेशन उल्लंघन का कारण।
जोड़ा लेखक alk, स्रोत
ओपी के कोड क्रैश होने के कारण कृपया मेरा अद्यतन उत्तर देखें।
जोड़ा लेखक alk, स्रोत

मुझे लगता है कि आप इस तरह कुछ लिखने की कोशिश कर रहे थे:

char family[3][MAX_LEN] = {"son", "father", "sister"};
strcat (family[i], "   ");

मूल के साथ "परिवार" की परिभाषा पर मतभेद:

 char *family[3] ={"son", "father", "sister"};

यह है कि यहां आपके पास 3 पॉइंटर्स 3 लीटरल कॉन्स स्ट्रिंग हैं जो केवल पढ़े जाते हैं। इस प्रकार आप उन्हें स्ट्रैट के साथ संशोधित नहीं कर सकते हैं।

जबकि char s [3] [एल] = {"ए", "बी", "सी"} पर आप ढेर में प्रत्येक के चार चार सरणी आवंटित करते हैं और उन्हें 3 अक्षर तक प्रारंभ करते हैं। तो अब यदि आप काफी बड़े हैं तो आप उन्हें स्ट्रैट के साथ संशोधित कर सकते हैं ...

इसके अलावा, आप strcat() को गलत तरीके से उपयोग कर रहे थे जैसे @alk ने इंगित किया ...

0
जोड़ा
@manuell: जवाब बदल गया, यह अब स्थिर नहीं है।
जोड़ा लेखक alk, स्रोत
आप एक स्ट्रिंग स्थिर करने के लिए strcat नहीं कर सकते हैं!
जोड़ा लेखक manuell, स्रोत
फिर, आप एक स्ट्रिंग स्थिर करने के लिए strcat नहीं कर सकते हैं!
जोड़ा लेखक manuell, स्रोत
हाँ क्षमा करें, इसे संपादित करें
जोड़ा लेखक rmp, स्रोत