2010-11-27 9 views
12

सी में, मैं जानता हूँ कि मैं इसक्या एक (पुनः) एक सरणी के सभी मानों को एक पंक्ति में सेट कर सकता है (इसे प्रारंभ करने के बाद)?

int myarray[5] = {a,b,c,d,e}; 

की तरह एक सरणी बना सकते हैं हालांकि, कल्पना सरणी पहले से ही की तरह

int myarray[5]; 

initialised गया था और तब कुछ बिंदु बाद में, मैं/परिवर्तन सेट करना चाहता था

myarray[0] = a; 
myarray[1] = b; 
myarray[2] = c; 
myarray[3] = d; 
myarray[4] = e; 

जा रहा बिना सभी मूल्यों लेकिन

बल्कि, कुछ अधिक की तरह
myarray = {a,b,c,d,e}; 

कारण है कि मैं पूछता हूँ इस वजह से अगर मैं ढेर पर मेरी सरणी घोषित, मैं जैसी सरणी आरंभ होगा:

int* myarray = malloc(5*sizeof(int)); 

तो मैं में सभी मूल्यों में प्रवेश करने के लिए सक्षम होने के लिए चाहते हैं एक पंक्ति (ज्यादातर मेरे कोड को क्लीनर बनाने के लिए)

उत्तर

11
memcpy(myarray, (int [5]){a,b,c,d,e}, 5*sizeof(int)); 
+1

क्या यह सी 99-केवल नहीं है? –

+3

हां। लेकिन जब कोई टेम्पलेट का उपयोग कर सी ++ उत्तर देता है, तो क्या उसे एक टिप्पणी की आवश्यकता होती है जिसके लिए सी ++ 98 की आवश्यकता होती है? या जब मैं सी में फ़ंक्शन प्रोटोटाइप का उपयोग करता हूं, तो क्या मुझे यह उल्लेख करने की आवश्यकता है कि यह प्री-एएनएसआई सी कार्यान्वयन में काम नहीं करेगा? सी 99 ** ** वर्तमान सी भाषा है। –

+3

@R .: दुर्भाग्य से कई लोग C89 के साथ फंस गए हैं, उदा। माइक्रोसॉफ्ट के पास अभी भी विजुअल स्टूडियो में सी 99 समर्थन नहीं है, और कई छात्रों को अभी भी टर्बो सी जैसे पुरातन कंपाइलर्स का उपयोग करना है, इसलिए शायद यह मानने के लिए उचित नहीं है कि अधिकांश लोग सी 99-विशिष्ट विशेषताओं का उपयोग करने में सक्षम हैं। –

1

नहीं, सी में ऐसी सुविधा नहीं है। यदि आप सभी सरणी तत्वों को उसी मान पर memset(3) पर सेट कर रहे हैं।

+5

इस उत्तर गुमराह किया जा सकता। 'memset' किसी मान पर "सरणी तत्व" असाइन नहीं करता है। यह एक विशिष्ट मान पर एक स्मृति ब्लॉक में * बाइट्स * असाइन करता है। दूसरा तर्क 'char' के रूप में व्याख्या किया जाएगा। उदाहरण के लिए, आप 'int []' से '10' के तत्वों को प्रारंभ करने के लिए 'memset' का उपयोग नहीं कर सकते हैं। –

+0

@ मेहरदाद, हाँ, दाएं। –

+1

लेकिन आप इसे तर्क के रूप में 255 पास करके 'uint {8,16,32,64} _t' 'UINT {8,16,32,64} _MAX' की सरणी शुरू करने के लिए उपयोग कर सकते हैं। :-) –

4

यहाँ एक समाधान है कि सभी मानकों संगत (C89, C99, C++)

यह लाभ यह है कि आप केवल एक ही स्थान पर डेटा दर्ज करने के बारे में चिंता नहीं है। किसी भी अन्य कोड को बदलने की जरूरत नहीं है - कोई जादू संख्या नहीं है। ढेर पर ऐरे घोषित किया गया है। डेटा तालिका घोषित घोषित किया गया है।

(Click here to try running it in Codepad)

#include<stdio.h> 
#include<stdlib.h> 

int main() 
{ 
unsigned int i = 0; 
int *myarray = 0; 
static const int MYDATA[] = {11, 22, 33, 44, 55}; 

    myarray = (int*)malloc(sizeof(MYDATA)); 
    memcpy(myarray, MYDATA, sizeof(MYDATA)); 

    for(i = 0; i < sizeof(MYDATA)/sizeof(*MYDATA); ++i) 
    { 
    printf("%i\n", myarray[i]); 
    } 

    free(myarray); 

    return 0; 
} 
+0

'MYDATA' को' स्थैतिक 'भी घोषित किया जा सकता है। – caf

+0

मैं इसे वोट दूंगा, लेकिन केवल तभी जब आप 'MYDATA' को' स्थिर 'में बदल दें। अन्यथा अधिकांश कंपाइलर इसके लिए बहुत खराब कोड उत्पन्न करेंगे। –

+0

MYDATA .text या .const नहीं .डेटा में होगा क्योंकि इसे कॉन्स घोषित किया गया है। यह कार्य के भीतर decalred है तो जुड़ाव आंतरिक है। इसलिए स्थिर या आवश्यक नहीं है। खैर मेरे अनुभव में, लेकिन शायद कैफ और आर में एक कंपाइलर है जहां यह एक मुद्दा है ताकि उन्हें शांत किया जा सके। – T33C

0
#include<stdio.h> 
#include<stdlib.h> 

int *setarray(int *ar,char *str) 
{ 
    int offset,n,i=0; 
    while (sscanf(str, " %d%n", &n, &offset)==1) 
    { 
     ar[i]=n; 
     str+=offset; 
     i+=1; 
    } 
    return ar; 
} 

int main() 
{ 
    int *sz=malloc(5*sizeof(int)),i; 

    //call 
    setarray(sz,"10 30"); 

    //output 
    for(i=0;i<2;i++) 
     printf("%d\n",sz[i]); 

    return 0; 
}