दिलचस्प पोस्ट
पायथन: प्रकार एरर: 'स्ट्र' और 'इंट' ऑब्जेक्ट्स को जोड़ नहीं सकते हैं ट्विटर बूटस्ट्रैप सक्रिय वर्ग को ली में जोड़ें C # का उपयोग करके FTP पर फ़ाइल अपलोड करें क्या सरणी की `लम्बाई` की संपत्ति को पढ़ना सचमुच जावास्क्रिप्ट में महंगा है? पायथन में एकल उद्धरण बनाम दोहरे उद्धरण एंड्रॉइड में होम बटन दबाएं लारेवेल के साथ मैत्री प्रणाली: बहुत से रिश्ते के लिए कई पैरेंट डिवी की ऊँचाई का विस्तार करें एक MYSQL स्व-जुड़ें कार्य कैसे करता है? Node.js में तुल्यकालिक अनुरोध पायथन में दो सॉर्टेड सूचियों के संयोजन जेनेरिक TryParse PHP कोड का उपयोग करके छवियों को MySQL डाटाबेस में कैसे अपलोड करें वसंत एनोटेशन @ वैल्यू के साथ गुण फ़ाइल और लोड से एक सूची पढ़ना बूस्ट एएसआईओ को अवरुद्ध करने के लिए समय-निर्धारण कैसे सेट करें?

एक संरचना को दूसरे में कॉपी करना

मुझे पता है कि मैं सदस्य द्वारा संरचना सदस्य की प्रतिलिपि बना सकता हूं, इसके बजाय मैं संरचनाओं पर एक memcpy कर सकता हूं?

क्या ऐसा करना उचित है?

मेरी संरचना में, मेरे पास एक स्ट्रिंग भी है, जिसकी मुझे एक ही सदस्य होने की दूसरी संरचना की प्रतिलिपि होती है। मैं उसको कैसे करू?

वेब के समाधान से एकत्रित समाधान "एक संरचना को दूसरे में कॉपी करना"

सादा असाइनमेंट द्वारा प्रतिलिपि करना सबसे अच्छा है, क्योंकि यह छोटा है, पढ़ने में आसान है, और एक उच्च स्तर का अमूर्तता है कहने के बजाय (कोड के मानव पाठक को) "ये बिट्स को यहां से कॉपी करें", और रीडर को प्रतिलिपि आकार तर्क के बारे में सोचने की आवश्यकता है, तो आप बस एक सादा असाइन कर रहे हैं ("इस मान को कॉपी करें यहाँ पर ")। इसमें कोई हिचकिचाहट नहीं हो सकती है कि आकार सही है या नहीं।

इसके अलावा, अगर संरचना भारी गद्देदार है, तो असाइनमेंट कंपाइलर को कुछ ज्यादा कुशल बनाना mempcy() , क्योंकि यह पैडिंग की प्रतिलिपि बनाने की ज़रूरत नहीं है (और यह जानता है कि यह कहां है), लेकिन mempcy() ऐसा इसलिए नहीं है कि यह हमेशा प्रतिलिपि mempcy() बाइट्स की सही संख्या जिसे आप कॉपी करने के लिए कहते हैं

यदि आपकी स्ट्रिंग एक वास्तविक सरणी है, यानी:

 struct { char string[32]; size_t len; } a, b; strcpy(a.string, "hello"); a.len = strlen(a.string); 

फिर आप सादे काम का उपयोग कर सकते हैं:

 b = a; 

एक पूरी प्रति प्राप्त करने के लिए हालांकि वैरिएबल-लेटरी डेटा के लिए इस तरह मॉडल किया गया है, यह पूरी तरह से प्रतिलिपि करने का सबसे प्रभावी तरीका नहीं है क्योंकि पूरी सरणी हमेशा प्रतिलिपि बनाई जाएगी।

हालांकि, सावधान रहें कि कॉपी करने वाले स्ट्रेंक्ट्स में पोकेर को ढेर-आवंटित स्मृति में शामिल करना थोड़ा खतरनाक हो सकता है, ऐसा करने से आप सूचक को अलियासिंग कर रहे हैं, और आम तौर पर इसे अस्पष्ट बनाते हैं जो प्रतिलिपि ऑपरेशन के बाद सूचक का मालिक है।

इन स्थितियों के लिए एक "गहरी कॉपी" वास्तव में एकमात्र विकल्प है, और इसके लिए फ़ंक्शन में जाने की आवश्यकता है।

C90 के बाद से, आप बस का उपयोग कर सकते हैं:

 dest_struct = source_struct; 

जब तक स्ट्रिंग को एक सरणी के अंदर याद किया जाता है:

 struct xxx { char theString[100]; }; 

अन्यथा, यदि यह एक संकेतक है, तो आपको इसे हाथ से कॉपी करना होगा।

 struct xxx { char* theString; }; dest_struct = source_struct; dest_struct.theString = malloc(strlen(source_struct.theString) + 1); strcpy(dest_struct.theString, source_struct.theString); 

अगर संरचनाएं संगत प्रकार के हैं, तो हाँ, आप ऐसा कुछ के साथ कर सकते हैं:

 memcpy (dest_struct, source_struct, sizeof (dest_struct)); 

आपको केवल एक चीज के बारे में पता होना चाहिए कि यह एक उथले प्रति है दूसरे शब्दों में, यदि आपके पास एक विशिष्ट स्ट्रिंग की ओर इशारा करते हुए एक char * , तो दोनों संरचना समान स्ट्रिंग पर इंगित करेंगे।

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

यदि आप मैन्युअल रूप से प्रत्येक फ़ील्ड को बिना एक आसान प्रति बनाना चाहते हैं, लेकिन गैर-उथले स्ट्रिंग प्रतियां के अतिरिक्त बोनस के साथ, strdup उपयोग करें:

 memcpy (dest_struct, source_struct, sizeof (dest_struct)); dest_struct->strptr = strdup (source_struct->strptr); 

यह संरचना की संपूर्ण सामग्री की नकल करेगा, फिर स्ट्रिंग की गहरी-प्रतिलिपि, प्रभावी रूप से प्रत्येक संरचना के लिए एक अलग स्ट्रिंग देगी।

और, यदि आपके सी कार्यान्वयन में एक strdup (यह आईएसओ मानक का हिस्सा नहीं है) नहीं है, तो यहां से एक प्राप्त करें ।

आप structs memcpy कर सकते हैं, या आप उन्हें किसी भी अन्य मूल्य की तरह असाइन कर सकते हैं।

 struct {int a, b;} c, d; ca = cb = 10; d = c; 
  1. आप किसी फ़ाइल में लिखने के लिए एक स्ट्रैट का उपयोग कर सकते हैं। आपको उसे `चार * के रूप में डालने की आवश्यकता नहीं है संरचित आकार भी संरक्षित किया जाएगा। (यह बिंदु विषय के निकट नहीं है लेकिन यह अनुमान लगाता है: हार्ड मेमोरी पर बर्ताव करना अक्सर रैम की तरह एक होती है।)

  2. एक स्ट्रिंग फ़ील्ड (और से) को ले जाने के लिए आपको strncpy उपयोग करना चाहिए और एक क्षणिक स्ट्रिंग बफर '\0' समाप्त करना है। कहीं आपको रिकॉर्ड स्ट्रिंग फ़ील्ड की लंबाई याद रखना चाहिए।

  3. अन्य फ़ील्ड को स्थानांतरित करने के लिए आप डॉट NodeB->one=intvar; उपयोग कर सकते हैं, उदाहरण .: NodeB->one=intvar; floatvar2=(NodeA->insidebisnode_subvar).myfl;

     struct mynode { int one; int two; char txt3[3]; struct{char txt2[6];}txt2fi; struct insidenode{ char txt[8]; long int myl; void * mypointer; size_t myst; long long myll; } insidenode_subvar; struct insidebisnode{ float myfl; } insidebisnode_subvar; } mynode_subvar; typedef struct mynode* Node; ...(main) Node NodeA=malloc... Node NodeB=malloc... 
  4. आप प्रत्येक स्ट्रिंग को ऐसे स्ट्रक्क्ट्स में एम्बेड कर सकते हैं जो इसे फिट करते हैं, पॉइंट-2 से बचने के लिए और कोबोल: NodeB->txt2fi=NodeA->txt2fi जैसे व्यवहार करते हैं … लेकिन आपको अभी भी एक क्षणिक स्ट्रिंग के साथ-साथ एक NodeB->txt2fi=NodeA->txt2fi आवश्यकता होगी, जैसा कि बिंदु पर बताया गया है -2 scanf , printf अन्यथा एक ऑपरेटर लंबे समय तक इनपुट (कम), (छिद्रित स्पेस द्वारा) काट नहीं किया जाएगा।

  5. (NodeB->insidenode_subvar).mypointer=(NodeA->insidenode_subvar).mypointer एक पॉइंटर एलियास बना देगा (NodeB->insidenode_subvar).mypointer=(NodeA->insidenode_subvar).mypointer
  6. NodeB.txt3=NodeA.txt3 कंपाइलर को अस्वीकार करने का कारण बनता है: error: incompatible types when assigning to type 'char[3]' from type 'char *'
  7. पॉइंट -4 केवल इसलिए काम करता है क्योंकि NodeB->txt2fi और NodeA->txt2fi उसी NodeA->txt2fi से संबंधित है !!

    मैं सी में पाया इस विषय के लिए एक सही और सरल जवाब , क्यों मैं घोषित करने के बाद एक चार सरणी के लिए स्ट्रिंग नहीं दे सकता? "एरेज़ (भी वर्ण) सी में द्वितीय श्रेणी वाले नागरिक हैं" !!!