दिलचस्प पोस्ट
स्विंग कीललाइस्टर और एक ही समय में एकाधिक कुंजी दबाई गई जावा तैयार किए गए स्थान और परिणामस्वरूप को बंद करने के लिए कहां? मैं सी # के साथ वेब कैमरा वीडियो कैसे स्ट्रीम कर सकता हूं? फाइबोनैचि रिकर्सिव फ़ंक्शन "काम" कैसे करता है? IIS7 – (413) अनुरोध इकाई बहुत बड़ा है | uploadReadAheadSize XmlSerializer द्वारा उत्सर्जित होने से शून्य प्रकार के प्रकार को दबाएं बेस -64 वर्ण सरणी के लिए अमान्य लंबाई समूह में सशर्त राशि क्वेरी द्वारा MSSQL कैसे एक php हेडर रीडायरेक्ट के माध्यम से प्राप्त स्ट्रिंग में प्राप्त चर को पारित करने के लिए? पृष्ठभूमि छवि डेटा को सीएसएस में Base64 अच्छा या बुरा अभ्यास के रूप में एम्बेड करना है? टेम्पलेट स्पेशलाइजेशन और सक्षम_आईफ़ अब जोडा-टाइम के साथ बीत चुके समय की गणना कैसे करें? वेब संग्रह के वेब-एनएफ़ निर्देशिका से एक संसाधन कैसे लोड करें पीडीओ तैयार बयान के साथ कई पंक्तियाँ डालें SSH कमांड को पासवर्ड प्रदान करने के लिए बैश स्क्रिप्ट में उम्मीद का उपयोग करें

मैं अज्ञात लंबाई की एक इनपुट स्ट्रिंग कैसे पढ़ सकता हूं?

अगर मुझे नहीं पता कि शब्द कितना समय है, तो मैं char m[6]; नहीं लिख सकता char m[6]; ,
शब्द की लंबाई शायद दस या बीस लंबी है कीबोर्ड से इनपुट प्राप्त करने के लिए मैं कैसे scanf का उपयोग कर सकता हूं?

 #include <stdio.h> int main(void) { char m[6]; printf("please input a string with length=5\n"); scanf("%s",&m); printf("this is the string: %s\n", m); return 0; } 

कृपया लंबाई = 5 के साथ एक स्ट्रिंग इनपुट करें
नमस्ते
यह स्ट्रिंग है: हैलो

Solutions Collecting From Web of "मैं अज्ञात लंबाई की एक इनपुट स्ट्रिंग कैसे पढ़ सकता हूं?"

एक क्षेत्र गतिशील रूप से सुरक्षित करते हुए दर्ज करें

ईजी

 #include <stdio.h> #include <stdlib.h> char *inputString(FILE* fp, size_t size){ //The size is extended by the input with the value of the provisional char *str; int ch; size_t len = 0; str = realloc(NULL, sizeof(char)*size);//size is start size if(!str)return str; while(EOF!=(ch=fgetc(fp)) && ch != '\n'){ str[len++]=ch; if(len==size){ str = realloc(str, sizeof(char)*(size+=16)); if(!str)return str; } } str[len++]='\0'; return realloc(str, sizeof(char)*len); } int main(void){ char *m; printf("input string : "); m = inputString(stdin, 10); printf("%s\n", m); free(m); return 0; } 

आज के कंप्यूटरों के साथ, आप बहुत बड़ी तारों (हजारों वर्णों) को आवंटित कर सकते हैं, जबकि कम्प्यूटर के राम उपयोग में शायद ही कोई गड्ढा बना। तो मैं बहुत ज्यादा चिंता नहीं करेगा

हालांकि, पुराने दिनों में, जब मेमोरी एक प्रीमियम पर थी, आम तौर पर विखंडू में स्ट्रिंग्स पढ़ना था। fgets इनपुट से अधिकतम वर्णों तक पढ़ता है, लेकिन बाकी इनपुट बफ़र को बरकरार छोड़ देता है, इसलिए आप इसे पसंद कर सकते हैं, लेकिन आप इसे पसंद कर सकते हैं।

इस उदाहरण में, मैं 200 वर्णों के खंड में पढ़ता हूं, लेकिन आप जो निश्चित रूप से इच्छित आकार का उपयोग कर सकते हैं।

 #include <stdio.h> #include <stdlib.h> #include <string.h> char* readinput() { #define CHUNK 200 char* input = NULL; char tempbuf[CHUNK]; size_t inputlen = 0, templen = 0; do { fgets(tempbuf, CHUNK, stdin); templen = strlen(tempbuf); inputlen += templen; input = realloc(input, inputlen+1); strcat(input, tempbuf); } while (templen==CHUNK-1 && tempbuf[CHUNK-2]!='\n'); return input; } int main() { char* result = readinput(); printf("And the result is [%s]\n", result); free(result); return 0; } 

ध्यान दें कि यह कोई त्रुटि जाँच के साथ एक सरल उदाहरण है; वास्तविक जीवन में आपको यह सुनिश्चित करना होगा कि fgets के रिटर्न वैल्यू की पुष्टि करके इनपुट ठीक है।

यह भी ध्यान रखें कि अंत में अगर रीडिनपुट रूटीन, कोई बाइट व्यर्थ नहीं होता है; स्ट्रिंग के पास सटीक स्मृति आकार है जिसकी आवश्यकता है।

अगर मैं एक सुरक्षित दृष्टिकोण का सुझाव दे सकता हूं:

स्ट्रिंग को रखने के लिए पर्याप्त बफ़र की घोषणा करें:

char user_input[255];

उपयोगकर्ता इनपुट को एक सुरक्षित तरीके से प्राप्त करें:

fgets(user_input, 255, stdin);

इनपुट प्राप्त करने का एक सुरक्षित तरीका, पहला तर्क एक बफर में पॉइंटर होता है जहां इनपुट संग्रहीत किया जाता है, दूसरा अधिकतम इनपुट को पढ़ना चाहिए और तीसरा मानक इनपुट के लिए एक सूचक है – यानी जहां उपयोगकर्ता इनपुट आता है से।

विशेष रूप से सुरक्षा दूसरे तर्क से आती है कि कितना पढ़ा जाएगा जो बफर ओवर्रन्स को रोकता है इसके अलावा, fgets संसाधित स्ट्रिंग निरर्थक समाप्त करने का ख्याल रखता है।

यहां उस फ़ंक्शन के बारे में अधिक जानकारी

संपादित करें: यदि आपको कोई भी स्वरूपण करने की आवश्यकता है (उदाहरण के लिए किसी स्ट्रिंग को किसी संख्या में कनवर्ट करें), तो इनपुट पर आपके पास एकोई का उपयोग कर सकते हैं।

मैंने एक मनमाने ढंग से लंबी स्ट्रिंग पढ़ने का एक ही आसान तरीका देखा है, लेकिन मैंने इसका इस्तेमाल कभी नहीं किया है। मुझे लगता है कि यह इस तरह से चला जाता है:

 char *m = NULL; printf("please input a string\n"); scanf("%ms",&m); if (m == NULL) fprintf(stderr, "That string was too long!\n"); else { printf("this is the string %s\n",m); /* ... any other use of m */ free(m); } 

% और s बीच m बताता है कि scanf() स्ट्रिंग को मापने और इसके लिए मेमोरी आवंटित करता है और स्ट्रिंग को उस में कॉपी करता है, और उस आवंटित स्मृति के पते को इसी तर्क में संग्रहीत करने के लिए कहते हैं। एक बार जब आप इसे पूरा कर लेंगे तो आपको free()

यह scanf() हर कार्यान्वयन पर समर्थित नहीं है, हालांकि।

जैसा कि दूसरों ने बताया है, सबसे आसान समाधान इनपुट की लंबाई पर एक सीमा तय करना है यदि आप अभी भी scanf() का उपयोग करना चाहते हैं तो आप ऐसा कर सकते हैं:

 char m[100]; scanf("%99s",&m); 

ध्यान दें कि m[] का आकार % और s बीच की संख्या से कम से कम एक बाइट होना चाहिए।

यदि प्रविष्ट किया गया स्ट्रिंग 99 की तुलना में लंबा है, तो शेष अक्षर दूसरे कॉल के द्वारा या scanf() में दिए गए बाकी स्ट्रिंग स्ट्रिंग द्वारा पढ़ने के लिए इंतजार करेंगे।

आम तौर पर उपयोगकर्ता इनपुट को संभालने के लिए scanf() की सिफारिश नहीं की जाती है। यह सबसे अच्छी तरह से मूल रूप से संरचित पाठ फ़ाइलों पर लागू होता है जो किसी अन्य एप्लिकेशन द्वारा बनाए गए थे। फिर भी, आपको यह अवश्य पता होना चाहिए कि इनपुट की उम्मीद के अनुसार प्रारूपित नहीं किया जा सकता है, क्योंकि किसी व्यक्ति ने आपके प्रोग्राम को तोड़ने के प्रयास में हस्तक्षेप किया हो सकता है।

सुरक्षित और तेज़ (दोहरीकरण क्षमता) संस्करण:

 char *readline(char *prompt) { size_t size = 80; char *str = malloc(sizeof(char) * size); int c; size_t len = 0; printf("%s", prompt); while (EOF != (c = getchar()) && c != '\r' && c != '\n') { str[len++] = c; if(len == size) str = realloc(str, sizeof(char) * (size *= 2)); } str[len++]='\0'; return realloc(str, sizeof(char) * len); } 

आवश्यक स्ट्रिंग को संग्रहीत करने के लिए एक वर्ण सूचक लें। यदि आपको स्ट्रिंग के संभावित आकार के बारे में कुछ पता है तो फ़ंक्शन का उपयोग करें

 char *fgets (char *str, int size, FILE* file);` 

अन्यथा आप मेमोल () फ़ंक्शन का उपयोग करके भी रनटाइम पर मेमोरी आवंटित कर सकते हैं जो गतिशील रूप से अनुरोधित मेमोरी प्रदान करता है।

fgets() साथ आवंटित स्थान में सीधे पढ़ें

सफल पढ़ना, फाइल के अंत, इनपुट त्रुटि और स्मृति से बाहर अलग पहचानने के लिए विशेष देखभाल की आवश्यकता है। ईओएफ पर आवश्यक उचित मेमोरी प्रबंधन

यह विधि एक पंक्ति के '\n' बरकरार रखती है।

 #include <stdio.h> #include <stdlib.h> #define FGETS_ALLOC_N 128 char* fgets_alloc(FILE *istream) { char* buf = NULL; size_t size = 0; size_t used = 0; do { size += FGETS_ALLOC_N; char *buf_new = realloc(buf, size); if (buf_new == NULL) { // Out-of-memory free(buf); return NULL; } buf = buf_new; if (fgets(&buf[used], (int) (size - used), istream) == NULL) { // feof or ferror if (used == 0 || ferror(istream)) { free(buf); buf = NULL; } return buf; } size_t length = strlen(&buf[used]); if (length + 1 != size - used) break; used += length; } while (buf[used - 1] != '\n'); return buf; } 

नमूना उपयोग

 int main(void) { FILE *istream = stdin; char *s; while ((s = fgets_alloc(istream)) != NULL) { printf("'%s'", s); free(s); fflush(stdout); } if (ferror(istream)) { puts("Input error"); } else if (feof(istream)) { puts("End of file"); } else { puts("Out of memory"); } return 0; } 

मुझे पता है कि मैं 4 साल बाद आया हूं और बहुत देर हो चुकी हूं, लेकिन मुझे लगता है कि मेरे पास एक और तरीका है जो किसी का उपयोग कर सकते हैं। मैंने getchar() फ़ंक्शन का उपयोग इस तरह किया था: –

 #include <stdio.h> #include <stdlib.h> #include <string.h> //I had putten the main Function Bellow this function. //d for asking string,f is pointer to the string pointer void GetStr(char *d,char **f) { printf("%s",d); for(int i =0;1;i++) { if(i)//Ie if i!=0 *f = (char*)realloc((*f),i+1); else *f = (char*)malloc(i+1); (*f)[i]=getchar(); if((*f)[i] == '\n') { (*f)[i]= '\0'; break; } } } int main() { char *s =NULL; GetStr("Enter the String:- ",&s); printf("Your String:- %s \nAnd It's length:- %lu\n",s,(strlen(s))); free(s); } 

इस कार्यक्रम के लिए नमूना चलाया गया है: –

 Enter the String:- I am Using Linux Mint XFCE 18.2 , eclispe CDT and GCC7.2 compiler!! Your String:- I am Using Linux Mint XFCE 18.2 , eclispe CDT and GCC7.2 compiler!! And It's length:- 67