Утверждения If и равенства
-
03-07-2019 - |
Вопрос
Я пытаюсь решить проблему здесь но я не знаю, почему мой код не работает.Любая помощь приветствуется.Редактировать:Отредактировано, чтобы внести исправления, упомянутые ниже, но во второй строке выходных данных все еще есть лишнее "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 ...