Si y declaraciones de igualdad
-
03-07-2019 - |
Pregunta
Estoy tratando de resolver el problema aquí pero no sé por qué mi código no funciona. Cualquier ayuda es apreciada. EDITAR: Editado para hacer la corrección mencionada a continuación, pero todavía hay un & Quot; 15 & Quot; (en negrita) en la segunda línea de la salida y no entiendo de dónde viene.
Mi salida es
18662658515 5552272 15
#include <stdlib.h>
#include <stdio.h>
int main(void){
int n;
int j;
scanf("%d\n", &n);
int i = 0;
char mystr[15];
for(;i<n;i++){
fgets(mystr,15,stdin);
for(j=0;j<15;j++){
if(isdigit(mystr[j])){
printf("%c", mystr[j]);
continue;
}
if ('A' <= mystr[j] && mystr[j] <= 'C')
printf("2");
if ('D' <= mystr[j] && mystr[j] <= 'F')
printf("3");
if ('G' <= mystr[j] && mystr[j] <= 'I')
printf("4");
if ('J' <= mystr[j] && mystr[j] <= 'L')
printf("5");
if ('M' <= mystr[j] && mystr[j] <= 'O')
printf("6");
if ('P' <= mystr[j] && mystr[j] <= 'S')
printf("7");
if ('T' <= mystr[j] && mystr[j] <= 'V')
printf("8");
if ('W' <= mystr[j] && mystr[j] <= 'Z')
printf("9");
}
printf("\n");
}
}
Solución
El problema es que está iterando sobre los 15 caracteres en la cadena de entrada, independientemente de la longitud de la entrada. El primer caso de prueba tiene 11 caracteres, pero el segundo caso tiene solo 8. En la segunda iteración, está procesando accidentalmente los dos últimos caracteres de la primera entrada, que fueron 15
.
Para solucionarlo, simplemente detenga su iteración cuando presione el carácter NUL 0, que termina la cadena cambiando esta línea
for(j=0;j<15;j++){
a
for(j=0; mystr[j] != 0; j++){
Otros consejos
Por un lado, creo que sus comparaciones son al revés. Por ejemplo, debería probar & Quot; if ('A' & Lt; = mystr [j] & Amp; & Amp; mystr [j] & Lt; = 'C' ) " ;.
Sería útil, quizás, tener una función entre () (con disculpas; mi C está oxidada):
bool between(char c, char before, char after) {
return before <= c && c <= after;
}
entonces
if ('A' <= mystr[j] && mystr[j] <= 'C')
printf("2");
se convierte
if (between(mystr[j], 'A', 'C')
printf("2");
Generalmente es mejor usar rangos medio abiertos, donde el límite inferior es inclusivo y el límite superior exclusivo. Con esto, entonces, el último elemento de cada prueba sería el primer elemento de la prueba anterior, lo que podría ayudarlo a detectar ciertos tipos de errores más fácilmente.
considere que es posible que desee comparar las cosas en el mismo orden. Habla esto en inglés sencillo antes de escribir el código. Si myLetterCode es mayor que A.code & Amp; & Amp; myLetterCode es menor que C.Code (¡debe ser B!).
mantenga su carta a la izquierda y lo que está comparando a la derecha. De lo contrario, se vuelve muy confuso muy rápido.
¿No sería esto más fácil con una tabla de búsqueda?
int numbers[] = { 2, 2, 2, 3, 3, 3,
4, 4, 4, 5, 5, 5, 6, 6, 6,
7, 7, 7, 7, 8, 8, 8, 9, 9, 9, 9};
... cut ...
if (isdigit (mystr[j]))
printf ("%c", mystr[j]);
else
printf ("%d", numbers[mystr[j] - 'A']);
... cut ...