दिलचस्प पोस्ट
अनुरोध हैडर फ़ील्ड ऐक्सेस-कंट्रोल-एप-हेडर्स की अनुमति खुद को प्रीफलाइट प्रतिक्रिया में नहीं है समयक्षेत्र जावास्क्रिप्ट के बिना पार्स की तारीख मैट्रिक्स स्तंभ नाम से मैट्रिक्स स्तंभ मान निकालें कैसे कुछ फ़ाइलों में git- चेरी लेने के लिए केवल परिवर्तन? क्या ऑटोमैपर लिंक का समर्थन करता है? अंतिम डाली गई पंक्ति के एंटनम्बर वैल्यू – एमएस एक्सेस / वीबीए एक पर्यावरण चर बनाने के लिए ENDLOCAL बचें Jquery सीएसएस और जेएस सीमित तत्वों यूनिट टेस्ट कैसे लिखूं? फेसबुक ग्राफ़ एपी – एक व्यवस्थापक के रूप में फैन पेज पर पोस्टिंग सी # पिक्चरबॉक्स पारदर्शी पृष्ठभूमि काम करने के लिए नहीं लगता है कैसे विंडोज कमांड लाइन से PHP को चलाने के लिए यूआरआई उपसर्ग के आधार पर डीबीपीडिया स्पेराक्यूल क्वेरी से परिणाम बहिष्कृत करें इंटरनेट एक्सप्लोरर का समर्थन पुशस्टेट और प्रतिस्थापित करता है? मैं पायथन में matplotlib में 'बैकेंड' कैसे सेट कर सकता हूं?

कैसे गतिशील रूप से एक स्ट्रिंग के लिए स्मृति स्थान आवंटित करें और उस स्ट्रिंग को उपयोगकर्ता से मिलता है?

मैं सी प्रोग्राम का उपयोग करके उपयोगकर्ता से इनपुट पढ़ना चाहता हूं। मैं जैसे सरणी का उपयोग नहीं करना चाहता,

char names[50]; 

क्योंकि अगर उपयोगकर्ता 10 की स्ट्रिंग देता है, तो शेष रिक्त स्थान बर्बाद हो जाते हैं।

अगर मैं वर्ण पॉइंटर का उपयोग करता हूं,

 char *names; 

तो मुझे इसके लिए स्मृति आवंटित करने की आवश्यकता है,

 names = (char *)malloc(20 * sizeof(char)); 

इस मामले में भी, स्मृति अपव्यय की संभावना है

इसलिए, मुझे स्ट्रिंग के लिए स्मृति को गतिशील आवंटित करना है जो स्ट्रिंग की लंबाई के समान है।

चलो मान लो,

यदि उपयोगकर्ता इनपुट "stackoverflow" , तो आवंटित स्मृति 14 (यानी स्ट्रिंग = 13 की लंबाई और '0 0 के लिए 1 अतिरिक्त स्थान) के लिए होनी चाहिए।

मैं यह कैसे हासिल कर सकता हूं?

वेब के समाधान से एकत्रित समाधान "कैसे गतिशील रूप से एक स्ट्रिंग के लिए स्मृति स्थान आवंटित करें और उस स्ट्रिंग को उपयोगकर्ता से मिलता है?"

एक बार में एक वर्ण पढ़ें ( getc(stdin) का उपयोग करके) और स्ट्रिंग ( realloc ) को बढ़ने के रूप में realloc

यहाँ कुछ समय पहले मैंने एक फ़ंक्शन लिखी है। ध्यान दें कि यह केवल पाठ इनपुट के लिए लक्षित है

 char *getln() { char *line = NULL, *tmp = NULL; size_t size = 0, index = 0; int ch = EOF; while (ch) { ch = getc(stdin); /* Check if we need to stop. */ if (ch == EOF || ch == '\n') ch = 0; /* Check if we need to expand. */ if (size <= index) { size += CHUNK; tmp = realloc(line, size); if (!tmp) { free(line); line = NULL; break; } line = tmp; } /* Actually store the thing. */ line[index++] = ch; } return line; } 

आपके पास एक सरणी हो सकती है जो 10 तत्वों के साथ शुरू होती है। वर्ण द्वारा इनपुट वर्ण पढ़ें यदि यह खत्म हो जाता है, तो एक और 5 और अधिक realloc। सबसे अच्छा नहीं, लेकिन फिर आप बाद में दूसरे स्थान को मुक्त कर सकते हैं।

अगर आपको मेमोरी छोड़नी है, तो हर बार चार और चार बार फिर से पढ़िए। प्रदर्शन मर जाएगा, लेकिन आप इस 10 बाइट्स को निकाल देंगे।

एक और अच्छा व्यापार एक समारोह में पढ़ना है (एक स्थानीय चर का उपयोग करके) फिर नकल। इसलिए बड़ा बफर कार्यवाही किया जाएगा।

आप नियमित अभिव्यक्ति का भी उपयोग कर सकते हैं, उदाहरण के लिए कोड का निम्नलिखित भाग:

 char *names scanf("%m[^\n]", &names) 

stdin से पूरी लाइन प्राप्त करेंगे, गतिशील रूप से उस स्थान की मात्रा को आवंटित कर लेगा। उसके बाद, ज़ाहिर है, आपको names नि: शुल्क करना होगा।

गतिशील स्ट्रिंग बनाने के लिए नीचे कोड है:

 void main() { char *str, c; int i = 0, j = 1; str = (char*)malloc(sizeof(char)); printf("Enter String : "); while (c != '\n') { // read the input from keyboard standard input c = getc(stdin); // re-allocate (resize) memory for character read to be stored str = (char*)realloc(str, j * sizeof(char)); // store read character by making pointer point to c str[i] = c; i++; j++; } str[i] = '\0'; // at the end append null character to mark end of string printf("\nThe entered string is : %s", str); free(str); // important step the pointer declared must be made free } 
 char* load_string() { char* string = (char*) malloc(sizeof(char)); *string = '\0'; int key; int sizer = 2; char sup[2] = {'\0'}; while( (key = getc(stdin)) != '\n') { string = realloc(string,sizer * sizeof(char)); sup[0] = (char) key; strcat(string,sup); sizer++ } return string; } int main() { char* str; str = load_string(); return 0; } 

यह अधिक आसान तरीका है

 char *in_str; in_str=(char *)malloc(512000 * sizeof(char)); enter code herescanf("\n%[^\n]",in_str);