Как реализовать toLower (), если вы уже получаете toUpper () - PullRequest
5 голосов
/ 01 февраля 2011

Предположим, вы уже получили функцию toUpper(), которая определена как int toUpper(char), Как вы можете реализовать функцию toLower(), которая int toLower(char).Спасибо.

Ответы [ 3 ]

3 голосов
/ 01 февраля 2011

Я полагаю, что это один из способов, который использует существующую реализацию toUpper (обратите внимание, что toLower и toUpper определены как употребление int, и я сделал это соответственно; я предполагаю, что у вас есть опечаткав вашем ОП):

int toLower(int c) {
    for(int i = 0; i <= UCHAR_MAX; i++) {
        if(c != i && toUpper(i) == c) {
            return i;
        }
    }
    return c;
}

Редактировать: Спасибо, Крис Латс .

2 голосов
/ 01 февраля 2011

Единственный правильный способ сделать это:

int toLower(int c)
{
    if(toUpper(c) != c) return c; // keep lowercase characters unchanged
    if(!isalpha(c)) return c;
    return c - 'A' + 'a'; // nonportable hack, only works for ASCII
}

Технически, последняя строка должна быть полнофункциональной switch, или что-то вроде:

static char lower[] = "abcdefghijklmnopqrstuvwxyz";
static char upper[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
// ...
return lower[strchr(upper, c) - upper];

Поскольку стандарт не гарантирует, что алфавитные символы являются последовательными в наборе символов.Однако поддержка ASCII достаточно хороша для большинства людей.

0 голосов
/ 01 февраля 2011

Создайте два параллельных массива (A и B), каждый достаточно большой, чтобы вместить весь набор символов.Просмотрите все значения в A и замените каждое значение на toUpper(value).Затем пройдитесь по B, и везде, где A будет отличаться, замените B [A [value]] на B [value] (т. Е. Везде, где toUpper заменил значение на заглавную версию, замените заглавную версию в B настрочная версия, из которой он был преобразован).Как только вы закончите, toLower просто вернет B[value] (и A можно отбросить).

Это предполагает, что вы имеете дело с прописными / строчными буквами, которые образуют биекцию (которую, я должен добавить, это не всегда так, но я считаю, что предположение подразумевается в вопросе).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...