Se e declarações de igualdade
-
03-07-2019 - |
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");
}
}
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 ...