2012-01-28 16 views
5

क्या आपको एक बार सरणी के माध्यम से मैन्युअल रूप से लूप करना है और प्रत्येक वर्ण सरणी के स्ट्रेल की गिनती प्राप्त करना है, इसे समेटें, समेकित मूल्य के साथ गंतव्य आवंटित करें और फिर सरणी पर फिर से लूप करें?सी में चरित्र सरणी की एक सरणी पर आप कैसे पुनरावृत्त करते हैं?

आप सरणी के सरणी वाले सरणी का आकार कैसे प्राप्त करते हैं ताकि आप उन्हें फिर से चालू कर सकें?

+1

कुछ कोड हमें यह समझने में मदद करेंगे कि आप क्या पूछ रहे हैं। – user7116

+0

लगता है जैसे आप सी स्ट्रिंग्स की सरणी कॉपी करना चाहते हैं। क्या वह सही है? – vitaut

+0

मैं अंततः सरणी में स्ट्रिंग को एक स्ट्रिंग में जोड़ना चाहता हूं। गंतव्य स्ट्रिंग के लिए कितनी मेमोरी स्पेस आवंटित करने की आवश्यकता है यह जानने की आवश्यकता है। मुझे नहीं पता कि कैसे आप जानते हैं कि लूप के लिए समाप्त स्थिति के रूप में क्या रखा जाए, यानी सरणी की लंबाई क्या है। –

उत्तर

7

आप सरणी कि पात्रों की सरणियों ताकि आप उन पर पुनरावृति कर सकते हैं के आकार कैसे पता करूं?

  1. रिकार्ड सरणी है जब आप एक चर में यह आवंटन में तार की संख्या:

वहाँ दो तरीके हैं।

  • सरणी के अंत में एक अतिरिक्त char* आवंटित करें और इसमें एक नल पॉइंटर को एक सेंटीनेल के रूप में संग्रहीत करें, जिस तरह से एक एनयूएल चरित्र स्ट्रिंग को समाप्त करने के लिए उपयोग किया जाता है।
  • दूसरे शब्दों में, आपको सरणी आवंटित करते समय अपनी खुद की बहीखाता करना है क्योंकि सी आपको वांछित जानकारी नहीं देगा। आप दूसरा सुझाव का पालन करते हैं, तो आप के साथ

    size_t sum_of_lengths(char const **a) 
    { 
        size_t i, total; 
        for (i = total = 0; a[i] != NULL; i++) 
         total += strlen(a[i]); 
        return total; 
    } 
    

    मत भूलना जब वास्तविक संयोजन कर एक '\0' के लिए स्थान आरक्षित करने के लिए तार के सरणी में वर्णों की कुल संख्या प्राप्त कर सकते हैं।

    +0

    वहां हम जाते हैं। धन्यवाद कि सबकुछ जवाब देता है। –

    +1

    वापस +1 की आवश्यकता है क्योंकि यह शून्य आधारित है? –

    +0

    ... या यदि आप वास्तव में एक सरणी प्राप्त करते हैं तो लंबाई प्राप्त करने के लिए आकार (सरणी)/sizeof (प्रविष्टि) का उपयोग करें (सूचक नहीं - वे समान नहीं हैं)। बहुत से लोग (मुझे पिछले 10 वर्षों या उससे भी ज्यादा) लगता है कि सरणी और पॉइंटर्स समान हैं, लेकिन वे नहीं हैं - यदि आवश्यक हो तो सरणी स्वचालित रूप से एक सूचक को स्वचालित रूप से खराब हो जाएंगी। जैसे int एक [10] = {0}; आकार (ए)/आकार (int) आपको 10 देगा; int * a = malloc (10 * sizeof (int)); आकार (ए) == आकार (int *) इस मामले में – griffin

    0

    मुझे लगता है कि आप तारों को जोड़ना चाहते हैं। यदि हां, तो हाँ। आपको यह जानना होगा कि आप इसे आवंटित करने से पहले कितनी जगह चाहते हैं।

    वास्तव में, आप realloc का उपयोग कर सकते हैं, लेकिन यह वास्तव में हर बार पिछली स्ट्रिंग की प्रतिलिपि बनाता है, और बहुत कम प्रभावी है।

    कुछ कोड: (char *s[] और int n संभालने)

    int i,l=1; 
    for (i=0;i<n;i++) l+=strlen(s[i]); 
    char *r=malloc(l); 
    r[0]=0; 
    for (i=0;i<n;i++) strcat(r,s[i]); 
    

    संपादित करें: कुछ टिप्पणियों के रूप में, strcat जब आप लंबाई पता अप्रभावी है। (। मैं अभी भी इसे पसंद करते है, क्योंकि यह एक बार में स्मृति को आबंटित) कुछ और अधिक प्रभावी कोड है:

    int i,l=1; 
    for (i=0;i<n;i++) l+=strlen(s[i]); 
    char *r=malloc(l); 
    char *d=r; 
    for (i=0;i<n;i++) { 
    srtcpy(d,s[i]); 
    d+=strlen(s[i]); 
    } 
    
    +0

    'स्ट्रैट' का यह उपयोग अविश्वसनीय रूप से महंगा है: यह एल्गोरिदम को ओ (एन²) समय में चलाने के कारण होता है जबकि यह रैखिक हो सकता है। –

    +0

    रैखिक कैसे पूरा किया जा सकता है? मेरे प्रश्न का @सासेलर हिस्सा यह है कि इस मामले में क्या पता चलाना है। –

    1

    मैं तुम्हें एक स्ट्रिंग सरणी में तार के सभी के संयोजन है कि बनाने के लिए कोशिश कर रहे हैं मान।

    ऐसा करने के 2 तरीके हैं:

    1. 2 गुजरता बनाने का सुझाव के रूप में, दूसरा पास में, पहले पास में लंबाई संक्षेप गंतव्य स्ट्रिंग का आवंटन, और फिर जोड़कर तार

    2. 1 पास करें। बफर को कुछ आकार में आवंटित करके प्रारंभ करें। कुल आकार का ट्रैक रखते हुए तारों को संलग्न करें। यदि आपके पास स्ट्रिंग के लिए पर्याप्त जगह नहीं है, तो realloc() के साथ बफर को पुन: आवंटित करें। पुनर्वितरण की सबसे प्रभावी विधि हर बार बफर के आकार को दोगुना करना होगा।

    0
    #include <stdio.h> 
    #include <stdlib.h> 
    #include <string.h> 
    
    char *nstrdup(char **args); 
    int main (int argc, char **argv) 
    { 
    char * this; 
    
    this = nstrdup(argv+1); 
    printf("[%s]\n", this); 
    
    return 0; 
    } 
    
    char *nstrdup(char **args) 
    { 
    size_t len, pos; 
    char **pp, *result; 
    
    len = 0; 
    for (pp = args; *pp; pp++) { 
         len += strlen (*pp); 
         } 
    result = malloc (1+len); 
    
    pos = 0; 
    for (pp = args; *pp; pp++) { 
         len = strlen (*pp); 
         memcpy(result+pos, *pp, len); 
         pos += len; 
         } 
    result[pos] = 0; 
    return result; 
    } 
    
    +0

    मुझे मेटा पसंद नहीं है। (मैं इंटरफेस को समझ नहीं पा रहा हूं)। मुझे लगता है कि जो लोग व्हाइटस्पेस (किसी प्रकार के कॉर्पोरेट कैनोलिक रूप में) संपादित करते हैं, वे कम जीवन रूप हैं। कृपया जाइए यहां से। ** बस मेरे स्रोत को स्पर्श न करें ** आप संपादकों को whitespae। यदि आप स्रोत नहीं पढ़ सकते हैं तो कृपया जावा पर वापस जाएं। – wildplasser

    +0

    [मेटा] कृपया इन बोगस व्हाइटस्पेस-नाज़ी संपादन को स्वीकार/अस्वीकार करने के लिए एक विकल्प जोड़ें। – wildplasser

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