2011-11-08 25 views
5

मैं निम्न सरणी घोषित करता हूं:मैं सी में "char *" सरणी की लंबाई कैसे प्राप्त करूं?

char* array [2] = { "One", "Two"}; 

मैं इस सरणी को फ़ंक्शन में पास करता हूं। मैं फ़ंक्शन में इस सरणी की लंबाई कैसे पा सकता हूं?

+1

चार सितारा == चरित्र सूचक –

+2

संयोग की तलाश में है का उपयोग करें, 'i'' शायद यह एक उचित सवाल है "हेरिस्टिक (मूल अंग्रेजी बोलने वालों के लिए प्रश्न को पढ़ने में आसान बनाने के अलावा) से बचने में मदद करेगा। – sarnold

उत्तर

17

अतिरिक्त प्रयास किए बिना आप इसे किसी फ़ंक्शन में पास करने के बाद किसी सरणी की लंबाई नहीं पा सकते हैं।

  1. एक कंटेनर है कि आकार संग्रहीत करता है, vector जैसे (सिफारिश) का उपयोग करें: करने के लिए आप की आवश्यकता होगी।
  2. इसके साथ आकार पास करें। इसके लिए शायद आपके मौजूदा कोड में कम से कम संशोधन की आवश्यकता होगी और सबसे तेज़ समाधान होगा।
  3. सी स्ट्रिंग्स जैसे सेंटीनेल मान का उपयोग करें। यह सरणी की लंबाई को रैखिक समय ऑपरेशन ढूंढता है और यदि आप सेंटीनेल मान भूल जाते हैं तो आपका प्रोग्राम क्रैश हो जाएगा। अधिकांश स्थितियों के लिए यह करने का सबसे बुरा तरीका है।
  4. जब आप इसे पास करते हैं तो सरणी के आकार को कम करने के लिए टेम्पलेटिंग का उपयोग करें। आप इसके बारे में यहाँ पढ़ सकते हैं: How does this Array Size Template Work?

मामले में आप सोच रहे थे, ज्यादातर लोगों तथ्य यह है कि सी तार इस तरह काम खेद है।

+0

इस प्रकार उन्होंने बी तारों का आविष्कार किया। –

+0

@MooingDuck लिंक कृपया :) Google विषय पर मां है –

+0

स्पष्ट रूप से सही नाम है [BSTR] (http://msdn.microsoft.com/en-us/library/windows/desktop/ms221069 (v = vs.85) .aspx) (लोग सी स्ट्रिंग से अधिक इनसे नफरत करते हैं) –

6

जब आप एक सरणी पास करते हैं तो फ़ंक्शन के भीतर आकार निर्धारित करने का एक आसान तरीका नहीं है।

आप या तो एक पैरामीटर या उपयोग std :: वेक्टर के रूप में सरणी आकार पारित कर सकते हैं < std :: स्ट्रिंग>

आप विशेष रूप से रोमांच महसूस कर रहे हैं, तो आप उपयोग कर सकते हैं some advanced template techniques

संक्षेप में यह कैसा

template <typename T, size_t N> 
void YourFunction(T (&array)[N]) 
{ 
    size_t myarraysize = N; 
} 
+0

हां, जो वर्तमान में मैं कर रहा हूं लेकिन मैं उस अतिरिक्त पैरामीटर को हटाना चाहता था। ओह अच्छी तरह से – bubbles

+0

एक std :: array वर्ग भी है। –

+3

@ बबल्स 'इंट मुख्य (argc, char ** argv) '। यदि यह सरल मुख्य था तो अलग-अलग किया जाएगा। –

0

अगर कुछ दिखता है आप का मतलब है कि सभी तारों को कितने समय तक जोड़ा गया है।

int n=2; 
int size=0; 
char* array [n] = { "One", "Two"}; 

for (int i=0;i<n;++i) 
    size += strlen(array[i]; 

जोड़ा गया:

हाँ thats क्या im वर्तमान में कर रहे, लेकिन मैं उस अतिरिक्त परमाटर दूर करने के लिए चाहता था। ओह अच्छी तरह से -

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

char* array [] = { (char*)2,"One", "Two"}; 

long size=(long)array[0]; 
for(int i=1; i<= size;++i) 
    printf("%s",array[i]); 

या फिर आप अपने सरणी समाप्त नल सकता

चार * सरणी [] = { "एक", "दो", (चार *) 0};

for(int i=0;array[i]!=0;++i) 
{ 
    printf("%s",array[i]); 
} 
0

पॉइंटर से सरणी आकार प्राप्त करना संभव नहीं है। आप सरणी को एक नल-पॉइंटर के साथ समाप्त कर सकते हैं। इस तरह आपका फ़ंक्शन आकार जानने के लिए नल-पॉइंटर की खोज कर सकता है, या बस नल को हिट करने के बाद केवल प्रोसेसिंग इनपुट को रोक सकता है ...

2

सी आपकी पीठ के पीछे कुछ चालबाजी कर रहा है।

void foo(int array[]) { 
    /* ... */ 
} 

void bar(int *array) { 
    /* ... */ 
} 

इन दोनों समान हैं:

6.3.2.1.3: को छोड़कर जब यह sizeof ऑपरेटर के संकार्य या एकल & ऑपरेटर, है या एक स्ट्रिंग शाब्दिक प्रारंभ करने में प्रयोग किया जाता है एक सरणी, एक अभिव्यक्ति जिसमें '' सरणी प्रकार 'प्रकार है, को' 'पॉइंटर टाइप टाइप' ' ' के साथ एक अभिव्यक्ति में परिवर्तित किया गया है जो सरणी ऑब्जेक्ट के प्रारंभिक तत्व को इंगित करता है और यह एक अंतराल नहीं है। यदि सरणी ऑब्जेक्ट में स्टोरेज क्लास पंजीकृत है, तो व्यवहार अपरिभाषित है।

नतीजतन, यदि आप नहीं जानते, foo() या bar(), यदि आप एक सरणी के साथ कहा जाता है, एक सरणी के एक भाग, या एक ही पूर्णांक के लिए सूचक थे अंदर:

void foo(int *array) सिर्फ खुद को याद दिलाना है कि वे वास्तव में एक सरणी, बल्कि एक पारित नहीं किया गया:
int a[10]; 
int b[10]; 
int c; 

foo(a); 
foo(&b[1]); 
foo(&c); 

कुछ लोगों की तरह उनके कार्यों लिखना पसंद एक पूर्णांक के लिए सूचक और कहीं और कहीं और पूर्णांक हो सकता है या नहीं। कुछ लोग अपने कार्यों को लिखना पसंद करते हैं जैसे: , यह बेहतर ढंग से याद दिलाता है कि फ़ंक्शन को पारित करने की अपेक्षा करता है। भी लंबाई paramenter साथ

  1. पास:

    जो जिस तरह से आप यह करने के लिए, अगर आप को पता है कितनी देर तक अपने सरणी है चाहता हूँ की तरह की परवाह किए बिना, आपके पास कुछ विकल्प मिल गया है। (int main(int argc, char *argv सोचें))।

  2. अपनी सरणी डिज़ाइन करें ताकि प्रत्येक तत्व गैर-NULL हो, अंतिम तत्व को छोड़कर। (char *s="almost a string"; या execve(2) सोचें।)
  3. अपने फ़ंक्शन को डिज़ाइन करें ताकि तर्कों का कुछ अन्य वर्णनकर्ता हो। (printf("%s%i", "hello", 10); सोचें - स्ट्रिंग अन्य तर्कों का वर्णन करती है। printf(3)stdarg(3) तर्क हैंडलिंग का उपयोग करता है, लेकिन यह आसानी से एक सरणी हो सकता है।)
+1

ट्रिविया: 'argv' दोनों बिंदु 1 और 2 करता है। – u0b34a0f6ae

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