Ответ от @rootkonda ({ ссылка }) объясняет, почему код не работал. Я рассмотрю другие проблемы и предложу альтернативную реализацию.
В зависимости от ввода ваш код имеет недопустимое (иначе неопределенное) поведение.
Если ввод - "aI"
и "bI"
, вы сделаете:
return week['I' - 'A]
, что составляет
return week[8];
Таким образом, вы получаете доступ к массиву за пределами границ.
Аналогичная проблема возникнет в случае, если две строки не имеет общей заглавной буквы. Затем вы делаете:
return week[0 - 'A']; // bad....
Ваш код должен обрабатывать такие случаи без сбоев.
В соответствии с описанием задачи единственными допустимыми заглавными буквами являются 'A', 'B', ..., 'G'
.
Ваш Текущий код проверяет содержимое s2
для каждой буквы в s1
. Это приводит к сложности O (N ^ 2), то есть к низкой производительности для длинных строк, когда соответствующая заглавная буква приближается к концу s1
.
Ниже приводится предложение, которое сначала анализирует s1
и генерирует табло для заглавных букв. Затем он анализирует s2
, используя табло. Сложность O (N).
char *day(char* s1, char* s2)
{
char* week[7] = {"MON", "TUE", "WED", "THU", "FRI", "SAT", "SUN"};
int capitalLettersFound[7] = {0}; // Scoreboard for 'A' .. 'G'
while (*s1)
{
if (*s1 >= 'A' && *s1 <= 'G')
{
// Update scoreboard
capitalLettersFound[*s1 - 'A'] = 1;
}
++s1;
}
while (*s2)
{
if (*s2 >= 'A' && *s2 <= 'G' && capitalLettersFound[*s2 - 'A'] == 1)
{
// Match found - return string
return week[*s2 - 'A'];
}
++s2;
}
// No match found
return "No matching capital letters found";
}