Если и утверждения равенства - PullRequest
0 голосов
/ 05 мая 2009

Я пытаюсь решить проблему здесь , но я не знаю, почему мой код не работает. Любая помощь приветствуется. РЕДАКТИРОВАТЬ: отредактировано для внесения исправлений, упомянутых ниже, но во второй строке вывода по-прежнему есть лишние «15» (жирным шрифтом), и я не понимаю, откуда они.

Мой вывод

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");
  }
}

Ответы [ 5 ]

6 голосов
/ 05 мая 2009

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

3 голосов
/ 05 мая 2009

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

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

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

до

for(j=0; mystr[j] != 0; j++){
2 голосов
/ 05 мая 2009

Возможно, было бы полезно иметь функцию между () (с извинениями; мой 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");

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

1 голос
/ 05 мая 2009

Разве это не будет проще с таблицей поиска?

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 ...
1 голос
/ 05 мая 2009

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

держите ваше письмо слева, а то, с чем вы сравниваете, - справа. В противном случае это очень запутанно и очень быстро.

...