为了获得最佳性能,您需要区分函数的可信输入和不可信输入。
例如,一个getBinNum()
接受用户输入的函数应该检查有效字符并压缩以删除前导零。首先,我们将展示一个通用的就地压缩函数:
// 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");
}
然后提供一个检查器函数,该函数返回传入的值,如果无效则返回 NULL:
// 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;
}
然后输入函数本身:
#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) {...}
如果用户选择从 以外的其他地方获取数据getBinNum()
,您可以允许他们调用checkBinNum()
来验证它。
如果你真的很偏执,你可以检查每个传递给你的例程的数字并采取相应的行动(返回 NULL),但这需要相对昂贵的检查,而这是不必要的。