दिलचस्प पोस्ट
जब आप encodeuri / encodeurcomponent के बजाय भागने का उपयोग करना चाहते हैं? वर्चुअल कीबोर्ड सक्रिय होने पर स्क्रीन स्टाइल है NSString ऑब्जेक्ट की अधिकतम लंबाई क्या है? नक्शा एक Google टैग जावास्क्रिप्ट एपीआई v3 पर प्रदर्शित नहीं हो रहा है जब डिव टैग में नेस्टेड किया जाता है ग्लासफिश 4.0 से ग्लासफिश 4.1.1 तक प्रवासन – जेडीबीसी क्षेत्र मुद्दा कई मूल्यों की तरह MySQL jqgrid: चयनित पंक्ति में स्तंभ मान के आधार पर उपकरण पट्टी विकल्प कैसे सेट करें कक्षाओं के बीच मैं एक जावा कॉलबैक कैसे करूं? ऑब्जेक्ट के सभी तरीकों को कैसे प्रदर्शित करें? स्विफ्ट IOS का उपयोग करके प्रत्येक शब्द को स्ट्रिंग में कैसे कैपिटल करना है सीएसएस फ़ाइल में डेटा-यूरी में उपयोग के लिए आप एक आधार -64 एनकोड करते हैं? स्विफ्ट कमांड लाइन कार्यक्रम में सीएफआरुन लूप मल्टीपार्ट / फ़ॉर्म-डेटा अनुरोध भेजने के लिए उपकरण पृष्ठ सामग्री में iframes का उपयोग नहीं करने के लिए अच्छे कारण खोज का प्रदर्शन () बनाम फर्स्टऑरिफॉल्ट ()

कैसे सी में एक चार सरणी कॉपी करने के लिए?

सी में, मेरे पास दो अक्षर हैं:

char array1[18] = "abcdefg"; char array2[18]; 

array1 के array1 के मान की प्रतिलिपि कैसे करें? क्या मैं यह कर सकता हूँ: array2 = array1 ?

Solutions Collecting From Web of "कैसे सी में एक चार सरणी कॉपी करने के लिए?"

आप सीधे array1 = array2 नहीं कर सकते क्योंकि इस मामले में आप एरे के पतों ( char * ) को हेरफेर करेंगे और उनके मूल्यों को नहीं।

इस तरह की स्थिति के लिए, बफर अतिप्रवाह से बचने के लिए strncpy का उपयोग करने की सिफारिश की जाती है, खासकर यदि array1 उपयोगकर्ता इनपुट (कीबोर्ड, नेटवर्क, इत्यादि) से भरा हुआ है। इस तरह:

 // Will copy 18 characters from array1 to array2 strncpy(array2, array1, 18); 

@प्रोफ के रूप में फलकन ने एक टिप्पणी में उल्लेख किया है, strncpy बुरा हो सकता है । सुनिश्चित करें कि आपका लक्ष्य बफ़र पर्याप्त रूप से स्रोत बफर (स्ट्रिंग के अंत में \0 सहित) को शामिल करने के लिए पर्याप्त है।

यदि आप गैर-टर्मिनेटेड स्ट्रिंग्स से रक्षा करना चाहते हैं, जो सभी प्रकार की समस्याएं पैदा कर सकता है, तो इस तरह से अपनी स्ट्रिंग कॉपी करें:

 char array1[18] = {"abcdefg"}; char array2[18]; size_t destination_size = sizeof (array2); strncpy(array2, array1, destination_size); array2[destination_size - 1] = '\0'; 

यह अंतिम पंक्ति वास्तव में महत्वपूर्ण है, क्योंकि strncpy() हमेशा तार समाप्त नहीं करता है। (यदि गंतव्य बफर पूरे स्रोत स्ट्रिंग को शामिल करने के लिए बहुत छोटा है, तो sntrcpy () नल गंतव्य स्ट्रिंग को समाप्त नहीं करेगा।)

Strncpy () के लिए मैनपैड () यहां भी बताता है "चेतावनी: यदि src के पहले एन बाइट्स में कोई रिक्त बाइट नहीं है, तो तार में रखा गया स्ट्रिंग निरर्थक नहीं होगा।"

कारण strncpy () यह कुछ अजीब तरह से व्यवहार करता है, क्योंकि यह वास्तव में मूल रूप से स्ट्रिंग्स को कॉपी करने का एक सुरक्षित तरीका नहीं था।

एक और तरीका है snprintf () को strcpy () के लिए एक सुरक्षित प्रतिस्थापन के रूप में उपयोग करना है:

 snprintf(array2, destination_size, "%s", array1); 

(टिप के लिए धन्यवाद jxh ।)

memcpy(array1, array2, sizeof(array2)); उपयोग करें memcpy(array1, array2, sizeof(array2)); अगर आपके arrays स्ट्रिंग एरेज़ नहीं हैं

आप सरणियों को असाइन नहीं कर सकते हैं, नाम स्थिर हैं जो बदला नहीं जा सकते।

आप सामग्री को कॉपी कर सकते हैं :

 strcpy(array2, array1); 

स्रोत मानते हुए एक वैध स्ट्रिंग है और यह कि आपके उदाहरण के रूप में गंतव्य काफी बड़ा है।

जैसा कि अन्य लोगों ने उल्लेख किया है, स्ट्रिंग्स को strcpy() या इसके वेरिएंट्स के साथ कॉपी किया जाता है कुछ मामलों में, आप snprintf() उपयोग भी कर सकते हैं

आप संरचनाओं के एक भाग के रूप में केवल एरे को उसी प्रकार निर्दिष्ट कर सकते हैं जैसे:

 typedef struct { char a[18]; } array; array array1 = { "abcdefg" }; array array2; array2 = array1; 

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

 void foo (char x[10], char y[10]) { x = y; /* pointer assignment! */ puts(x); } 

फ़ंक्शन से लौटने के बाद ही सरणी अपरिवर्तित बनी हुई है।

सरणियों के लिए यह "पॉइंटर वैल्यू" अर्थ को क्षय करता है, यह कारण है कि असाइनमेंट काम नहीं करता है। एल-मान में सरणी प्रकार है, लेकिन आर-मान क्षययुक्त सूचक प्रकार है, इसलिए असाइनमेंट असंगत प्रकारों के बीच है।

 char array1[18] = "abcdefg"; char array2[18]; array2 = array1; /* fails because array1 becomes a pointer type, but array2 is still an array type */ 

के रूप में क्यों "सूचक मूल्य को क्षय" अर्थ शुरू किया गया था, यह सी के पूर्ववर्ती के साथ स्रोत कोड संगतता प्राप्त करना था। आप विवरण के लिए सी भाषा के विकास को पढ़ सकते हैं।

इसे ऐसा दिखना चाहिए:

 void cstringcpy(char *src, char * dest) { while (*src) { *(dest++) = *(src++); } *dest = '\0'; } ..... char src[6] = "Hello"; char dest[6]; cstringcpy(src, dest); 
 array2 = array1; 

सी में समर्थित नहीं है आपको ऐसा करने के लिए फ़ंक्शन स्ट्रक्पी () का उपयोग करना होगा

मैं डेटा कॉपी करने के लिए memcpy () का उपयोग करने की सलाह देता हूं। इसके अलावा, अगर हम किसी बफर को array2 = array1 रूप में असाइन करते हैं, तो दोनों सरणी की एक ही स्मृति होती है और arrary1 में कोई भी बदलाव array2 में भी वही करता है लेकिन हम memcpy का उपयोग करते हैं, दोनों बफर में भिन्न सरणी हैं मैं memcpy () सुझाता है क्योंकि strcpy और संबंधित फ़ंक्शन नल वर्ण की प्रतिलिपि नहीं करते हैं

सी केवल नीचे काम करता है … सी + + आपको चार सरणी करना है तो एक स्ट्रिंग प्रतिलिपि का उपयोग करें तो उपयोगकर्ता स्ट्रिंग टोकनिज़ोर फ़ंक्शंस … c ++ इसे किसी भी चीज़ को करने के लिए बहुत कठिन बना दिया

 #include <iostream> #include <fstream> #include <cstring> #define TRUE 1 #define FALSE 0 typedef int Bool; using namespace std; Bool PalTrueFalse(char str[]); int main(void) { char string[1000], ch; int i = 0; cout<<"Enter a message: "; while((ch = getchar()) != '\n') //grab users input string untill { //Enter is pressed if (!isspace(ch) && !ispunct(ch)) //Cstring functions checking for { //spaces and punctuations of all kinds string[i] = tolower(ch); i++; } } string[i] = '\0'; //hitting null deliminator once users input cout<<"Your string: "<<string<<endl; if(PalTrueFalse(string)) //the string[i] user input is passed after //being cleaned into the null function. cout<<"is a "<<"Palindrome\n"<<endl; else cout<<"Not a palindrome\n"<<endl; return 0; } Bool PalTrueFalse(char str[]) { int left = 0; int right = strlen(str)-1; while (left<right) { if(str[left] != str[right]) //comparing most outer values of string return FALSE; //to inner values. left++; right--; } return TRUE; } 

पूर्णांक प्रकारों के लिए

 #include <string.h> int array1[10] = {0,1,2,3,4,5,6,7,8,9}; int array2[10]; memcpy(array2,array1,sizeof(array1)); // memcpy("destination","source","size") 

आप उन्हें प्रतिलिपि बनाने के लिए सरणियां नहीं दे सकते। आप एक से दूसरे की सामग्री की प्रतिलिपि कैसे बना सकते हैं, यह कई कारकों पर निर्भर करता है:

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

 #include <string.h> char array1[18] = "abcdefg"; char array2[18]; ... strcpy(array2, array1); 

यदि आप नहीं जानते कि गंतव्य सरणी पर्याप्त है, लेकिन स्रोत सी स्ट्रिंग है, और आप गंतव्य को उचित सी स्ट्रिंग snprinf() , snprinf() उपयोग करें:

 #include <stdio.h> char array1[] = "a longer string that might not fit"; char array2[18]; ... snprintf(array2, sizeof array2, "%s", array1); 

यदि स्रोत सरणी को आवश्यक रूप से समाप्त नहीं किया गया है, लेकिन आप जानते हैं कि दोनों सरणियों का एक ही आकार है, तो आप memcpy उपयोग कर सकते हैं:

 #include <string.h> char array1[28] = "a non null terminated string"; char array2[28]; ... memcpy(array2, array1, sizeof array2);