सरल "सही" तरीका शायद इस एक, Bjarne Stroustrup पेपर Learning Standard C++ As A New Language से लिया है।
(नोट: मैं while(true)
के बजाय while(1)
उपयोग करने के लिए @ matejkramny की टिप्पणी के कारण के बजाय isspace()
के लिए जाँच बस लाइन के अंत में Bjarne का कोड बदल इसके अलावा, ... और इतने लंबे समय हम पर्याप्त विधर्मी जा रहा है कर रहे हैं के रूप में। Stroustrup के कोड को संपादित करने के लिए, मैं C89 भी सी के बजाय ++ शैली टिप्पणी में subbed गया है :-P)
#include <stdio.h>
#include <ctype.h>
#include <stdlib.h>
void quit() /* write error message and quit */
{
fprintf(stderr, "memory exhausted\n");
exit(1);
}
int main()
{
int max = 20;
char* name = (char*) malloc(max); /* allocate buffer */
if (name == 0) quit();
printf("Enter a file name: ");
while (1) { /* skip leading whitespace */
int c = getchar();
if (c == EOF) break; /* end of file */
if (!isspace(c)) {
ungetc(c, stdin);
break;
}
}
int i = 0;
while (1) {
int c = getchar();
if (isspace(c) || c == EOF) { /* at end, add terminating zero */
name[i] = 0;
break;
}
name[i] = c;
if (i == max - 1) { /* buffer full */
max += max;
name = (char*) realloc(name, max); /* get a new and larger buffer */
if (name == 0) quit();
}
i++;
}
printf("The filename is %s\n", name);
free(filename); /* release memory */
return 0;
}
को शामिल किया गया है कि:।
- खाली स्थान के लंघन जब तक आप में चरित्र तक पहुँचने
- डाल स्ट्रिंग बफर के विस्तार गतिशील मनमाने ढंग से आकार तार फिट करने के लिए
- जब स्मृति
आवंटित नहीं किया जा सकता से निपटने की स्थिति वहाँ सरल लेकिन टूटी समाधान कर रहे हैं, जो भी एक सा तेजी से चला सकता है? पूर्ण रूप से!!
यदि आप स्कैनफ़ को एक बफर में पढ़ने के आकार पर कोई सीमा नहीं देते हैं, तो आपका इनपुट बफर के आकार से अधिक है, यह एक सुरक्षा छेद और/या क्रैश बनाएगा।
पढ़ने के आकार को सीमित करने के लिए कहें, फ़ाइल नाम के केवल 100 अद्वितीय वर्ण क्रैश होने से बेहतर प्रतीत हो सकते हैं। लेकिन यह बदतर हो सकता है; उदाहरण के लिए यदि उपयोगकर्ता का अर्थ (...)/dir/foo/bar.txt
था, लेकिन आप bar.t
नामक फ़ाइल को ओवरराइटर करना चाहते हैं और शायद वे इसकी परवाह करते हैं।
इन मुद्दों से निपटने में जल्दी ही अच्छी आदतें प्राप्त करना सबसे अच्छा है। मेरी राय यह है कि यदि आपकी आवश्यकताओं को कुछ नजदीकी धातु और "सी-जैसे" को उचित ठहराना है, तो सी ++ पर कूदने पर विचार करना उचित है। यह ठीक से इन चिंताओं को प्रबंधित करने के लिए डिज़ाइन किया गया था - तकनीकें जो मजबूत और एक्स्टेंसिबल हैं, फिर भी अच्छी तरह से प्रदर्शन करती हैं।
संभावित उपयोग नकल http://stackoverflow.com/questions/314401/how-to-read-a-line-from-the-console-in-c –