Question

J'essaie de résoudre le problème ici mais je ne sais pas pourquoi mon code ne fonctionne pas. Toute aide est appréciée. EDIT: Édité pour apporter les corrections mentionnées ci-dessous, mais il reste encore un & Quot; 15 & Quot; supplémentaire (en gras) sur la deuxième ligne de la sortie et je ne comprends pas d’où il vient.

Ma sortie est

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");
  }
}
Était-ce utile?

La solution

Le problème est que vous parcourez les 15 caractères de la chaîne d'entrée, quelle que soit la longueur de l'entrée. Le premier cas de test comporte 11 caractères, mais le deuxième cas n'en contient que 8. À la deuxième itération, vous traitez accidentellement les deux derniers caractères de la première entrée, qui étaient 15.

Pour résoudre ce problème, arrêtez simplement votre itération lorsque vous frappez le caractère NUL 0, qui termine la chaîne en modifiant cette ligne

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

à

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

Autres conseils

D'une part, je pense que vos comparaisons sont à rebours. Par exemple, vous devriez tester & Quot; if ('A' & Lt; = mystr [j] &; & Et; mystr [j] & Lt; = 'C' ) & ";

Il serait peut-être utile d’avoir une fonction entre () (avec des excuses; mon C est rouillé):

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

alors

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

devient

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

Il est généralement préférable d’utiliser des plages semi-ouvertes, où la limite inférieure est inclusive et la limite supérieure exclusive. Dans ce cas, le dernier élément de chaque test serait le premier élément du test précédent, ce qui pourrait vous aider à détecter plus facilement certains types de bogues.

considérez que vous pourriez vouloir comparer les choses dans le même ordre. Parlez-le en anglais avant d'écrire du code. Si myLetterCode est supérieur à A.code & Amp; & Amp; myLetterCode est inférieur à C.Code (ce doit être B!).

gardez votre lettre à gauche et la chose à laquelle vous la comparez à droite. Sinon, cela devient très déroutant très rapidement.

Ne serait-ce pas plus facile avec une table de correspondance?

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 ...
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top