2013-02-16 19 views
11

चार करने के लिए जब मैंनियत मान सरणी

char a[10] = "Hi"; 

टाइप मैं कोई त्रुटि मिलती है लेकिन जब मैंने उसे निम्न के बदलने के लिए, मैं एक त्रुटि मिलती है: Array type char is not assignable.

char a[10]; 
a = "Hi"; 

सरणी प्रकार चार क्यों नहीं है आबंटित? क्या ऐसा इसलिए है क्योंकि भाषा उद्देश्य पर इस तरह लिखा गया है या क्या मुझे कोई बिंदु नहीं है?

+0

प्रतिक्रियाओं के लिए की कोई जरूरत नहीं लिखने के लिए कोई आवश्यकता नहीं है कि

 #include <iostream> using namespace std; int main() { char message[3] = {'H', 'i', '\0'}; cout << message<< endl; return 0; } 

की तरह अपने कोड लिख सकते हैं: इस टैग है के बाद से सी ++, है 'char []' से निपटने के दौरान ऐसा करने के लिए एक * non * -strcpy "अधिक C++" तरीका है? –

+0

char "[] के बजाय स्ट्रिंग या वेक्टर का उपयोग करने के लिए" अधिक C++ तरीका "होगा। Char [] का उपयोग करके आप मूल रूप से सभी सी-नेस को स्वीकार कर रहे हैं जो इसके साथ जाता है। – Cogwheel

+0

आपके प्रतिक्रिया लोगों के लिए धन्यवाद। –

उत्तर

12

std::copy उपयोग कर सकते हैं यह कर, जैसा कि मैंने ऊपर टिप्पणी की की सी ++ तरह से, std::string बजाय char[] उपयोग करने के लिए किया जाएगा। यह आपको असाइनमेंट व्यवहार देगा जो आप उम्मीद कर रहे हैं।

कहा यही कारण है, कारण है कि आप केवल दूसरे मामले के लिए एक त्रुटि हो रही है कि इन दो पंक्तियों में = अनेक अर्थ है:

char a[10] = "Hi"; 
a = "Hi"; 

पहले एक प्रारंभ है, दूसरा एक काम है ।

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

दूसरी ओर, दूसरी (अमान्य) रेखा a को "Hi" के एक (तकनीकी रूप से अलग) incantation के संदर्भ में बदलने की कोशिश करती है। ऊपर बताए गए कारणों के लिए इसकी अनुमति नहीं है। एक बार आपके पास प्रारंभिक सरणी हो जाने के बाद, केवल एक चीज जो आप इसके साथ कर सकते हैं, उससे मूल्य पढ़ते हैं और इसके लिए मूल्य लिखते हैं। आप अपना स्थान या आकार नहीं बदल सकते हैं। इस मामले में एक असाइनमेंट करने का प्रयास किया जाएगा।

+1

क्या आप इस बात को ध्यान में रखेंगे कि आप ' std :: string' और ओपी चाहता है व्यवहार प्राप्त करें? मुझे लगता है कि एक अच्छे जवाब के लिए एक अच्छा जोड़ा होगा। – NathanOliver

+1

हाँ, मैं आमतौर पर इस तरह के प्रश्नों के दो स्तर के उत्तर देने का प्रयास करता हूं (एक प्रत्यक्ष, दूसरे दूसरे अनुमान का इरादा)। चूंकि पूछने वाले ने मेरी टिप्पणी देखी थी और यह धागा डुप्ली के रूप में बंद हो गया था, मुझे लगता है कि मुझे परेशान नहीं था। – Cogwheel

2

ए सरणी के लिए एक सूचक है, सरणी नहीं। इसे फिर से सौंप नहीं किया जा सकता है।

आपने सी ++ बीटीडब्ल्यू के साथ टैग किया है। उस मामले के लिए बेहतर std :: स्ट्रिंग का उपयोग करें। यह शायद आप और अधिक उम्मीद कर रहे हैं।

+1

'ए 'सरणी है, सरणी के लिए सूचक नहीं है। यह * पहले तत्व में एक सूचक में निहित रूप से परिवर्तित किया जा सकता है। –

8

भाषा स्ट्रिंग अक्षर को वर्ण सरणी को असाइन करने की अनुमति नहीं देती है। आप strcpy() बजाय का उपयोग करना चाहिए:

strcpy(a, "Hi"); 
+1

सही - इस तरह की स्थिति के लिए आपको 'strcpy' का उपयोग करना चाहिए। आपको कभी भी 'strncpy' के बारे में भी सुना है, शायद कोई नुकसान नहीं होगा - यह लगभग 'बेकार' के रूप में बेकार है। –

+0

संबंधित ['strcpy' और 'strcpy_s' के बीच अंतर?] (Http://stackoverflow.com/questions/32136185/difference-between-strcpy-and-strcpy-s) –

16

एक सरणी एक परिवर्तनीय lvalue

उपयोग

char a[10]; 
strcpy(a, "Hi"); 
0

सरल नहीं है,

char a[10] = "Hi"; 

एक छोटे से "अतिरिक्त सुविधा" है, क्योंकि इसे रन-टाइम पर ऐसा नहीं किया जा सकता है।

लेकिन सी/सी ++ मानक पुस्तकालयों का यही कारण है।

#include <string.h> 

// ... 
strcpy(a,"Test"); // STR-ing C-o-PY. 

यह सी की मानक लाइब्रेरी से आता है। यदि सी ++ का उपयोग करना है तो आपको std :: स्ट्रिंग का उपयोग करना चाहिए, जब तक कि आप वास्तव में अपने गंतव्य पीसी से सभी संभावित प्रदर्शन को चूसना नहीं चाहते हैं।

0

ऐसा इसलिए है क्योंकि प्रारंभिकरण असाइनमेंट नहीं है। पहली चीज जो काम करती है वह प्रारंभिक है, और दूसरा, जो काम नहीं करता है, अपेक्षित है, असाइनमेंट है। आप बस सरणी को मान निर्दिष्ट नहीं कर सकते हैं, आपको strcpy या memcpy जैसे sth का उपयोग करना चाहिए। या आप वैकल्पिक रूप से <algorithm>

-2

यह इतना आसान है, (=) के दो अलग-अलग औसत असाइनमेंट और प्रारंभिकरण हैं। आप भी इस कोड आप एक मुश्किल कोड या समारोह और यहां तक ​​कि string.h

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