सर्वश्रेष्ठ प्रदर्शन प्राप्त करने के लिए, आपको अपने कार्यों में भरोसेमंद और अविश्वसनीय इनपुट के बीच अंतर करने की आवश्यकता है।
उदाहरण के लिए, जैसे फ़ंक्शन को उपयोगकर्ता से इनपुट स्वीकार करने के लिए वैध वर्णों के लिए जांच की जानी चाहिए और प्रमुख शून्य को निकालने के लिए संपीड़ित किया जाना चाहिए। तब
// Check untested number, return NULL if bad.
char *checkBinNum (char *num) {
char *ptr;
// Check for valid number.
for (ptr = num; *ptr == '0'; ptr++)
if ((*ptr != '1') && (*ptr != '0'))
return NULL;
return num;
}
:
// General purpose compression removes leading zeroes.
void compBinNum (char *num) {
char *src, *dst;
// Find first non-'0' and move chars if there are leading '0' chars.
for (src = dst = num; *src == '0'; src++);
if (src != dst) {
while (*src != '\0')
*dst++ = *src++;
*dst = '\0';
}
// Make zero if we removed the last zero.
if (*num == '\0')
strcpy (num, "0");
}
फिर एक चेकर समारोह है कि या तो रिटर्न मूल्य में पारित कर दिया, या शून्य अगर यह अवैध था प्रदान करते हैं: सबसे पहले, हम एक सामान्य प्रयोजन यथा-स्थान संपीड़न समारोह दिखाता हूँ इनपुट समारोह में ही:
#define MAXBIN 256
// Get number from (untrusted) user, return NULL if bad.
char *getBinNum (char *prompt) {
char *num, *ptr;
// Allocate space for the number.
if ((num = malloc (MAXBIN)) == NULL)
return NULL;
// Get the number from the user.
printf ("%s: ", prompt);
if (fgets (num, MAXBIN, stdin) == NULL) {
free (num);
return NULL;
}
// Remove newline if there.
if (num[strlen (num) - 1] == '\n')
num[strlen (num) - 1] = '\0';
// Check for valid number then compress.
if (checkBinNum (num) == NULL) {
free (num);
return NULL;
}
compBinNum (num);
return num;
}
अन्य कार्यों को जोड़ने या गुणा इनपुट ग्रहण करने के लिए लिखा जाना चाहिए करने के लिए पहले से ही मान्य है, क्योंकि यह वीं में कार्यों में से एक द्वारा बनाया गया है जाएगा पुस्तकालय है यह सवाल करने के लिए प्रासंगिक नहीं है के बाद से मैं उनके लिए कोड प्रदान नहीं करेगा: उपयोगकर्ता के अलावा अन्य कहीं से अपने डेटा स्रोत के लिए चुनता
char *addBinNum (char *num1, char *num2) {...}
char *mulBinNum (char *num1, char *num2) {...}
, तो आप उन्हें यह प्रमाणित करने के लिए checkBinNum()
कॉल करने के लिए अनुमति दे सकता है।
यदि आप वास्तव में पागल थे, तो आप अपने दिनचर्या में पारित हर नंबर की जांच कर सकते हैं और तदनुसार कार्य कर सकते हैं (वापस लौटें), लेकिन इसके लिए आवश्यक अपेक्षाकृत महंगे चेक की आवश्यकता होगी।
नकारात्मक बाइनरी संख्या तार असामान्य हैं, इसलिए आप शायद strtoul (3) – camh