Для того, чтобы получить максимальную производительность, вам необходимо различать доверенный и ненадежный ввод ваших функций.
Например, функция, например , которая принимает входные данные от пользователя, должна быть проверена на наличие допустимых символов и сжата для удаления ведущих нулей. Во-первых, мы покажем общее назначение в месте функцию сжатия:
// 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) {...}
Если пользователь выбирает источник их данные где-нибудь, кроме , вы можете позволить им позвонить checkBinNum()
, чтобы проверить его.
Если вы действительно были параноиками, вы можете проверить каждое число, переданное вашим подпрограммам, и действовать соответствующим образом (вернуть NULL), но для этого потребуются относительно дорогие проверки, которые не нужны.
Негативные бинарные строки строк необычны, поэтому вы, вероятно, захотите использовать strtoul (3) – camh