आप चाहिए कभी नहीं उपयोग gets
(या एक असीम स्ट्रिंग के आकार के साथ scanf
) के बाद से है कि आप अतिप्रवाह बफ़र होना को खोलता है। का उपयोग stdin
हैंडल के साथ करें क्योंकि यह आपको अपने बफर में रखे गए डेटा को सीमित करने की अनुमति देता है।
यह एक छोटा सा टुकड़ा मुझे प्रयोक्ता की ओर लाइन इनपुट के लिए उपयोग करें:
#include <stdio.h>
#include <string.h>
#define OK 0
#define NO_INPUT 1
#define TOO_LONG 2
static int getLine (char *prmpt, char *buff, size_t sz) {
int ch, extra;
// Get line with buffer overrun protection.
if (prmpt != NULL) {
printf ("%s", prmpt);
fflush (stdout);
}
if (fgets (buff, sz, stdin) == NULL)
return NO_INPUT;
// If it was too long, there'll be no newline. In that case, we flush
// to end of line so that excess doesn't affect the next call.
if (buff[strlen(buff)-1] != '\n') {
extra = 0;
while (((ch = getchar()) != '\n') && (ch != EOF))
extra = 1;
return (extra == 1) ? TOO_LONG : OK;
}
// Otherwise remove newline and give string back to caller.
buff[strlen(buff)-1] = '\0';
return OK;
}
यह मैं अधिकतम आकार सेट कर सकते हैं, अगर बहुत अधिक डेटा लाइन पर दर्ज किया गया है की पहचान करेगा, और बाकी फ्लश लाइन के साथ-साथ यह अगले इनपुट ऑपरेशन को प्रभावित नहीं करता है।
आप की तरह कुछ के साथ यह परीक्षण कर सकते हैं: एक POSIX प्रणाली पर
// Test program for getLine().
int main (void) {
int rc;
char buff[10];
rc = getLine ("Enter string> ", buff, sizeof(buff));
if (rc == NO_INPUT) {
// Extra NL since my system doesn't output that on EOF.
printf ("\nNo input\n");
return 1;
}
if (rc == TOO_LONG) {
printf ("Input too long [%s]\n", buff);
return 1;
}
printf ("OK [%s]\n", buff);
return 0;
}
सिस्टम लाइब्रेरीज़ को स्कैनफ को कमांड को ओवरफ़्लो को लागू करने के लिए लागू नहीं करते हैं (मैं समझता हूं कि प्रोग्राम के भीतर यदि डेवलपर इनपुट की जांच नहीं करता है तो ओवरफ़्लो हो सकता है, लेकिन सिस्टम लाइब्रेरी सुरक्षित है?)। – Marm0t
नहीं, यदि आप 20 बाइट बफर में स्कैनफ ("% s") 'हैं और उपयोगकर्ता 40-बाइट लाइन में प्रवेश करता है, तो आप को रोक दिया जाता है। 'स्कैनफ़'' का पूरा बिंदु स्कैन-स्वरूपित है और उपयोगकर्ता इनपुट की तुलना में थोड़ा अधिक _unformatted_ है :-) – paxdiablo
@ मार्म 0t - निम्न प्रश्नों पर विचार करके इस तरह से सोचें: कार्यान्वयन को ओवरफ्लो को कैसे रोक सकता है यदि यह सब मिलता है स्मृति बफर के आकार के बारे में कार्यान्वयन को बताता है कि किसी भी पैरामीटर के बिना स्मृति के एक टुकड़े (एक char * के रूप में टाइपकास्ट) के लिए एक सूचक? –