Con el fin de obtener el mejor rendimiento, es necesario distinguir entre la entrada seguros y no seguros a sus funciones.
Por ejemplo, una función como que acepta la entrada del usuario debe ser revisada en busca de caracteres válidos y comprimida para eliminar ceros a la izquierda. En primer lugar, vamos a mostrar un propósito general función de compresión en el lugar:
// 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");
}
a continuación, proporcionar una función que devuelve corrector sea aprobada en el valor, o NULL si era válido:
// 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;
}
Entonces la función de entrada en sí:
#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;
}
Otras funciones de suma o multiplica debe ser escrito para asumir la entrada ya es válida, ya que habrá sido creado por una de las funciones en º es biblioteca. No voy a proporcionar el código para ellos ya que no es relevante para la cuestión:
char *addBinNum (char *num1, char *num2) {...}
char *mulBinNum (char *num1, char *num2) {...}
Si el usuario opta por obtener sus datos de otro lugar que , podría permitir que se llaman checkBinNum()
para validarlo.
Si estuviera realmente paranoico, podría verificar cada número que pasa en sus rutinas y actuar en consecuencia (devolver NULO), pero eso requeriría controles relativamente caros que no son necesarios.
Las cadenas numéricas negativas son inusuales, por lo que probablemente desee utilizar strtoul (3) – camh