假设您已经获得了toUpper()
函数,该函数定义为int toUpper(char)
,
如何实现toLower()
函数int toLower(char)
。
感谢。
答案 0 :(得分:3)
我认为这是使用toUpper
的现有实现的一种方式(请注意,toLower
和toUpper
被定义为吃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)。
这假设您正在处理形成双射的大/小写(我应该补充说,情况并非总是如此 - 但我相信这个假设隐含在问题中)。