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");
  }
}
¿Fue útil?

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 ...
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top