2012-04-10 17 views
17

लिए वर्णों की स्ट्रिंग नियत मुझे पता है क्यों पहले बयान काम करता है और दूसरा नहीं क्यों C++एक चार सरणी

char a[10]="iqbal"; // it works 

a="iqbal"; // does not work 
+0

क्या यह सी या सी ++ है? कृपया निर्दिष्ट करें। –

+2

यह एसओ इंटरफ़ेस द्वारा प्रत्यक्ष अनुमान के रूप में आता है। कृपया पोस्ट करने से पहले खोजें: संभव डुप्लिकेट [अक्षरों के सरणी के लिए तारों को असाइन करना] (http://stackoverflow.com/questions/579734/assigning-strings-to-arrays-of-characters) –

उत्तर

18

सच पूछिये तो में से एक है, एक सरणी एक सूचक नहीं है चाहते हैं! और एक सरणी (सरणी के आधार पता) नहीं कर सकते एक परिवर्तनीय lvalue हो। यानी यह एक असाइनमेंट ऑपरेटर के बाईं ओर दिखाई नहीं दे सकता है। केवल कुछ परिस्थितियों में पॉइंटर्स में क्षय क्षय हो जाता है। एरेज़ पॉइंटर्स में क्षय होने पर सीखने के लिए यह SO post पढ़ें। यहाँ है एक और nice article जो सरणियों और संकेत

के बीच मतभेद भी lvalues ​​और rvalues ​​here ताकि आप चीजों की एक विचार है जो =

एक चार

[10 की एलएचएस पर प्रकट नहीं कर सकते हैं के बारे में पढ़ा बताते हैं ] = "इकबाल"; // यह काम करता है

इस मामले में, आंतरिक रूप से क्या होता है

a[0] = 'i'; 
a[1] = 'q'; 
. 
. 
a[5] = '\0'; 

तो सब कुछ ठीक है के रूप में array[i] एक परिवर्तनीय lvalue है।

ए = "इकबाल"; //

आंतरिक काम नहीं करता है, यह मोटे तौर पर

0x60000(Address of a, but is a simple number here) = Address of "iqbal" 

यह गलत है के रूप में हम एक नंबर के लिए कुछ नहीं सौंप सकते के बराबर है।

+2

असल में, 'ए' एक संशोधित है lvalue, लेकिन असाइनमेंट ऑपरेटर के बाईं ओर दिखाई नहीं दे सकता है। लवल और रावल्यू में एल और आर का अर्थ बहुत पहले खो गया था। – avakar

+0

'ए' एक लाभार्थी हो सकता है लेकिन _modifiable_ lvalue और _hence_' '' के एलएचएस पर दिखाई नहीं दे सकता है? यदि आप गलत हैं तो क्या आप मुझे कुछ दस्तावेज पर इंगित कर सकते हैं? मैं [यह] जा रहा हूं (http://publib.boulder.ibm.com/infocenter/comphelp/v7v91/index.jsp?topic=%2Fcom.ibm.vacpp7a.doc%2Flanguage%2Fref%2Fclrc05lvalue.htm) –

+0

@ पवनमंजनाथ: सरणी औपचारिक तर्क के संदर्भ में एक समारोह में वास्तविक तर्क के रूप में 'ए' को पार करने पर विचार करें। स्पष्ट रूप से 'ए' इस मामले में एक लाभा है, और संशोधित है। और अभिव्यक्ति का लालसा या रैवल्यू-नेस संदर्भ पर निर्भर नहीं है, इसलिए 'ए' एक संशोधित अंतराल है। –

3

पहली पंक्ति एक बयान नहीं है लेकिन प्रारंभिकरण के साथ एक घोषणा है। दूसरी पंक्ति असाइनमेंट ऑपरेटर के साथ एक अभिव्यक्ति कथन है।

आप सी

में सरणियों असाइन नहीं कर सकते लेकिन अगर आप एक स्ट्रिंग शाब्दिक के तत्वों के साथ एक सरणी को प्रारंभ कर सकते हैं।

4

चार सरणी स्थिर होगी और यदि आप इसे इस तरह प्रारंभ करते हैं तो बदला नहीं जा सकता है। वैसे भी आप सी में एक स्ट्रिंग स्ट्रिंग को एक = "iqbal" असाइन नहीं कर सकते हैं। इसके लिए आपको strncpy या memcpy का उपयोग करना होगा। अन्यथा आप स्ट्रिंग में पॉइंटर को ओवरराइट करने का प्रयास करेंगे, और यह वही नहीं है जो आप चाहते हैं।

char a[10]; 
strncpy(a, "iqbal", sizeof(a) - 1); 
a[sizeof(a) - 1] = 0; 

-1 समाप्त शून्य के लिए एक बाइट आरक्षण है:

तो सही कोड की तरह कुछ करना होगा। ध्यान दें, यदि स्ट्रिंग को समाप्त कर दिया गया है या नहीं, तो आपको खुद को जांचना होगा। बुरा एपीआई एक strlcpy() कॉल है जो यह आपके लिए करता है लेकिन यह glibc में शामिल नहीं है।

0

जब चार लेखन एक [10] = "इकबाल" आप चरित्र सरणी के तत्वों पात्रों के साथ एक आरंभ कर रहे हैं। हम int प्रकार के साथ ऐसा कर सकते हैं (ध्यान दें कि char प्रकार थोड़ा अलग उपचार मिलता है): int [10] = {1,2, ...};

लेकिन घोषणा के बाद निम्नलिखित को लिखना के रूप में अमान्य होगा, एक सूचक की तरह ही व्यवहार किया जाएगा। तो ए = {1,2, ...} जैसे कुछ लिखना; या एक = "इकबाल" कोई अर्थ नहीं उठाएगा!

1

क्यों पहले बयान से काम करता है और ग में नहीं एक दूसरे ++

क्योंकि वे अलग अलग बयान, लगभग पूर्ण कोई संबंध नहीं हैं क्यों। इस तथ्य से भ्रमित न हों कि वे दोनों = प्रतीक का उपयोग करते हैं। एक मामले में, यह ऑब्जेक्ट प्रारंभिकता का प्रतिनिधित्व करता है। दूसरे मामले में, असाइनमेंट ऑपरेटर।

आपकी पहली पंक्ति कानूनी है क्योंकि चरित्र सरणी समेत समेकन आरंभ करना कानूनी है।

आपकी दूसरी पंक्ति कानूनी नहीं है क्योंकि यह किसी सरणी को असाइन करने के लिए कानूनी नहीं है।

चूंकि यह सी ++ है, तो क्या मैं सुझाव दे सकता हूं कि आप नग्न सरणी से बचें? चरित्र तारों के लिए std::string का उपयोग करें। अन्य सरणी के लिए std::vector का उपयोग करें। यदि आप करते हैं, तो आप उदाहरण बन जाता है:

std::string a = "iqbal"; // it works 
a="iqbal"; // so does this 
0

कोशिश:

char a[10]="iqbal"; 
char *my_a = a; 

और my_a साथ काम करते हैं।

संबंधित मुद्दे