C 如果已经得到toUpper(),如何实现toLower()

C 如果已经得到toUpper(),如何实现toLower(),c,C,假设您已经获得了函数toUpper(),该函数定义为inttoupper(char), 如何实现函数toLower(),即int-toLower(char)。 谢谢。我想这是使用toUpper现有实现的一种方法(注意toLower和toUpper被定义为吃int,我已经相应地这样做了;我假设您的OP中有一个打字错误): inttolower(intc){ 对于(int i=0;i创建两个平行数组(A和B),每个数组的大小足以容纳整个字符集。逐步遍历A中的所有值,并将每个值替换为toUpper(v

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

谢谢。

我想这是使用
toUpper
现有实现的一种方法(注意
toLower
toUpper
被定义为吃
int
,我已经相应地这样做了;我假设您的OP中有一个打字错误):

inttolower(intc){

对于(int i=0;i创建两个平行数组(A和B),每个数组的大小足以容纳整个字符集。逐步遍历A中的所有值,并将每个值替换为
toUpper(value)
。然后逐步遍历B,在A不同的地方,将B[A[value]]替换为B[value](即,everywhere
toUpper
将值替换为大写版本,将B中的大写版本替换为转换后的小写版本)。完成后,
toLower
只返回
B[值]
(可以丢弃a)


这假设您处理的是构成双射的大写/小写(我应该补充一点,这种情况并不总是如此——但我相信这个假设在问题中是隐含的)。

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

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支持对大多数人来说“足够好了”。

toupper
tolower
int-tolower(int)
,而不是
int-tolower(char)
@Chris Lutz:不,我不这么认为。请查看
if
条件。我的不好。你改变了它吗?我记得不一样,但我可能只是没有功能(今天发生了这种情况)@Chris Lutz:我知道这种感觉;不用担心。我原本有
upper==c&&c!=I
,但后来改为
c!=I&&upper==c
。小改动:A)如果取出变量
upper
并将
toUpper
调用放入
If
语句中,则短路,只需调用
toUpper
一次或两次。B)
255
应该是
UCHAR\u MAX
,以实现最大的可移植性。不知道您的需求是否要求您不使用其他标准库函数。如果需要,则您的需求是最不幸的。
static char lower[] = "abcdefghijklmnopqrstuvwxyz";
static char upper[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
// ...
return lower[strchr(upper, c) - upper];