Вопрос

Я пытаюсь решить проблему здесь но я не знаю, почему мой код не работает.Любая помощь приветствуется.Редактировать:Отредактировано, чтобы внести исправления, упомянутые ниже, но во второй строке выходных данных все еще есть лишнее "15" (выделено жирным шрифтом), и я не понимаю, откуда это взялось.

Мой вывод таков

18662658515 555227215

#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");
  }
}
Это было полезно?

Решение

Проблема в том, что вы перебираете все 15 символов во входной строке, независимо от длины входных данных.Первый тестовый пример содержит 11 символов, но второй - только 8.На второй итерации вы случайно обрабатываете последние два символа из первого ввода, которые были 15.

Чтобы исправить это, просто остановите свою итерацию, когда вы нажмете нулевой символ 0, который завершает строку, изменяя эту строку

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

Для

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

Другие советы

Во-первых, я думаю, что ваши сравнения обратны.Например, вы должны тестировать "if ('A' <= мистр[j] && мистр[j] <= 'C')".

Возможно, было бы полезно иметь функцию between() (с извинениями;мой C заржавел):

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

итак

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

становится

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

Как правило, лучше использовать полуоткрытые диапазоны, где нижний предел является включающим, а верхний - исключающим.Таким образом, при этом последний элемент каждого теста будет первым элементом предыдущего теста, что может помочь вам легче обнаруживать определенные виды ошибок.

подумайте, что вы, возможно, захотите сравнить данные в одном и том же порядке.Произнесите это простым английским языком, прежде чем писать код.Если myLetterCode больше, чем A.code && myLetterCode меньше, чем C.Code (это должно быть B!).

держите свою букву слева, а то, с чем вы ее сравниваете, справа.В противном случае все очень быстро становится очень запутанным.

Разве это не было бы проще с помощью таблицы подстановки?

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 ...
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top