Tengo un fragmento de código que usa el bloque if-else if-else . Me pregunto si existen posibles formas de acortar la larga declaración condicional else if (cardLength == 16) && (numberArray[0] == 5 && (numberArray[1] == 1 || numberArray[1] == 2 || numberArray[1] == 3 || numberArray[1] == 4 || numberArray[1] == 5)) , por ejemplo, sin cambiar la lógica. En python, puedo hacerlo de esta manera: if (cardLength == 16) and (numberArray[0:2] in range(51,56)) . ¿Hay algún azúcar de sintaxis específico que pueda usar para este propósito en C?
if (cardLength == 15) && (numberArray[0] == 3 && (numberArray[1] == 4 || numberArray[1] == 7)) { printf("AMEX\n"); } else if (cardLength == 16) && (numberArray[0] == 5 && (numberArray[1] == 1 || numberArray[1] == 2 || numberArray[1] == 3 || numberArray[1] == 4 || numberArray[1] == 5)) { printf("MASTERCARD\n"); } else if (cardLength == 13) && (numberArray[0] == 4) { printf("VISA\n"); } else { printf("INVALID\n"); }Póngalo en una función (estática). No pienses en el rendimiento/optimización todavía.
static char *card_leng_type2string( unsigned len, int *arr) { if (len == 15 && arr[0] == 3 && arr[1] == 4 ) return "AMEX"; if (len == 15 && arr[0] == 3 && arr[1] == 7 ) return "AMEX"; if (len == 16 && arr[0] == 5 && arr[1] == 1 ) return "MASTERCARD"; if (len == 16 && arr[0] == 5 && arr[1] == 2 ) return "MASTERCARD"; if (len == 16 && arr[0] == 5 && arr[1] == 3 ) return "MASTERCARD"; if (len == 16 && arr[0] == 5 && arr[1] == 4 ) return "MASTERCARD"; if (len == 16 && arr[0] == 5 && arr[1] == 5 ) return "MASTERCARD"; if (len == 13 && arr[0] == 4) return "VISA"; return "INVALID"; }Ahora su código de llamada podría simplemente hacer:
printf("%s\n", card_leng_type2string(cardLength, numberArray) );Podría convertir los primeros dos dígitos de numberArray en un nuevo número como este
num = numberArray[0]*10 + numberArray[1]y luego usar eso en las declaraciones condicionales para hacerlas más legibles
int num = numberArray[0]*10 + numberArray[1] if ((cardLength == 15) && ((num == 37) || (num == 34))) { printf("AMEX\n"); } else if ((cardLength == 16) && ((num >= 51) && (num <= 55))) { printf("MASTERCARD\n"); } else if ((cardLength == 13) && ((num >= 40) && (num <= 49))) { printf("VISA\n"); } else { printf("INVALID\n"); } return 0; }Suponiendo que las entradas en numberArray están en el rango 0-9, podría usar la función strchr . Esto devuelve no NULL si una cadena determinada contiene un carácter específico.
Reemplazar:
numberArray[1] == 4 || numberArray[1] == 7 || numberArray[1] == 9con
strchr("479", '0' + numberArray[1]) Si numberArray fuera una matriz de caracteres, entonces la comprobación podría simplificarse a strchr("479", numberArray[1])