Pergunta

Eu estou tentando resolver o problema aqui mas eu não sei por que meu código não está funcionando. Qualquer ajuda é apreciada. EDIT:. Editado para fazer a correção mencionados abaixo, mas ainda há um extra de "15" (em negrito) na segunda linha da saída e eu não entendo de onde ele está vindo

A minha saída é

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

Solução

O problema é que você está interagindo sobre todos os 15 caracteres na cadeia de entrada, independentemente da duração da entrada. O primeiro caso de teste tem 11 caracteres, mas o segundo caso tem apenas 8. Na segunda iteração, você está processando acidentalmente os dois últimos caracteres a partir da primeira entrada, que foram 15.

Para corrigi-lo, basta parar a sua iteração quando você bate o personagem NUL 0, que termina a string alterando esta linha

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

para

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

Outras dicas

Por um lado, acho que suas comparações são para trás. Por exemplo, deve ser testando "se ( 'A' <= mystr [j] && mystr [j] <= 'C')".

Seria útil, talvez, ter uma função entre () (com desculpas, meu C está enferrujado):

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

para

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

se torna

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

Em geral, é melhor usar intervalos de semi-aberto, onde o limite inferior é inclusivo e exclusivo limite superior. Com este, então, o último elemento de cada teste seria o primeiro elemento do teste anterior, o que poderia ajudar a detectar certos tipos de erros mais facilmente.

considerar que você pode querer comparar coisas na mesma ordem. Fale isso na planície Inglês antes de escrever código. Se myLetterCode é maior do que A.code && myLetterCode é Menos de C.Code (deve ser B!).

manter a sua carta à esquerda e a coisa que você está comparando-a à direita. Caso contrário, ele fica muito confuso muito rápido.

ESTA NÃO SERIA mais fácil com uma tabela de pesquisa?

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 em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top