如果你已经获得toUpper(),如何实现toLower()

时间:2011-02-01 03:38:06

标签: c

假设您已经获得了toUpper()函数,该函数定义为int toUpper(char), 如何实现toLower()函数int toLower(char)。 感谢。

3 个答案:

答案 0 :(得分:3)

我认为这是使用toUpper的现有实现的一种方式(请注意,toLowertoUpper被定义为吃int,我已相应地这样做了;我假设您的OP中有拼写错误:

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

修改:谢谢,Chris Lutz

答案 1 :(得分:2)

我能看到的唯一正确方法是:

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支持“足够好”。

答案 2 :(得分:0)

创建两个并行数组(A和B),每个数组足以容纳整个字符集。单步执行A中的所有值,并用toUpper(value)替换每个值。然后逐步执行B,并且A到处都不同,用B [value]替换B [A [value]](即,将toUpper替换为大写版本的值,替换B中的大写版本使用转换它的小写版本)。完成后,toLower只返回B[value](并且可以丢弃A)。

这假设您正在处理形成双射的大/小写(我应该补充说,情况并非总是如此 - 但我相信这个假设隐含在问题中)。