Domanda

Sto cercando di risolvere il problema qui ma non so perché il mio codice non funziona. Qualsiasi aiuto è apprezzato. EDIT: modificato per apportare le correzioni di seguito indicate, ma c'è ancora un & Quot; 15 & Quot; (in grassetto) sulla seconda riga dell'output e non capisco da dove provenga.

Il mio output è

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");
  }
}
È stato utile?

Soluzione

Il problema è che stai iterando su tutti e 15 i caratteri nella stringa di input, indipendentemente dalla lunghezza dell'input. Il primo caso di test ha 11 caratteri, ma il secondo caso ha solo 8. Nella seconda iterazione, stai accidentalmente elaborando gli ultimi due caratteri dal primo input, che erano 15.

Per risolverlo, basta interrompere l'iterazione quando si preme il carattere NUL 0, che termina la stringa modificando questa riga

for(j=0;j<15;j++){

a

for(j=0; mystr[j] != 0; j++){

Altri suggerimenti

Per prima cosa, penso che i tuoi confronti siano all'indietro. Ad esempio, dovresti testare & Quot; if ('A' & Lt; = mystr [j] & Amp; & Amp; mystr [j] & Lt; = 'C' ) quot &;.

Sarebbe utile, forse, avere una funzione tra () (con scuse; la mia C è arrugginita):

bool between(char c, char before, char after) {
    return before <= c && c <= after;
}

così

if ('A' <= mystr[j] && mystr[j] <= 'C')
        printf("2");

diventa

if (between(mystr[j], 'A', 'C')
        printf("2");

In genere è preferibile utilizzare intervalli semiaperti, in cui il limite inferiore è inclusivo e il limite superiore esclusivo. Con questo, quindi, l'ultimo elemento di ogni test sarebbe il primo elemento del test precedente, che potrebbe aiutarti a rilevare più facilmente alcuni tipi di bug.

considera che potresti voler confrontare le cose nello stesso ordine. Parla in un inglese semplice prima di scrivere il codice. Se myLetterCode è maggiore di A.code & Amp; & Amp; myLetterCode è inferiore a C.Code (deve essere B!).

mantieni la tua lettera a sinistra e la cosa con cui la stai confrontando a destra. Altrimenti diventa molto confuso molto velocemente.

Non sarebbe più facile con una tabella di ricerca?

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 ...
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top