toupper功能

问题描述 投票:0回答:1

我想知道C中的toupper()函数是如何工作的。我在下面的代码中尝试,但我肯定做错了。代码编译,但传递给toupper()的参数没有大写...

char **copyArgs(int argc, char **argv) {
    char **a = malloc(sizeof(char *) * (argc));

    int i;
    for(i = 0; i < argc; i++) {
        int size = strlen(argv[i]);
        a[i] = malloc(sizeof(char) * (size + 1));
        strcpy(a[i], argv[i]);
        a[i] = toupper(a[i]);
    }
    return a;
}

如果我用“一二”测试它,它会产生“一二”,而不是“一两”。任何建议表示赞赏。

c uppercase toupper
1个回答
4
投票

toupper将单个字母转换为大写字母。在你的情况下,由于隐式转换中C的宽恕,你传递一个指向它而不是char的指针,所以很明显它无法正常工作。可能你得到一个“没有强制转换的整数转换的隐式指针”警告:这是一个强烈的迹象,表明你做了一些非常错误的事情。

整个事情并没有爆炸,因为在你的平台上int和指针一样大(或者,至少,对于那些你正在使用的指针来说足够大); toupper试图将int解释为一个角色,发现它是非字母的并且不加修改地返回它。这是纯粹的运气,在其他平台上你的程序可能会崩溃,因为指向int转换的指针被截断,并且因为toupper范围之外的整数unsigned char的行为(加上EOF)是未定义的。

要将整个字符串转换为大写,您必须遍历其所有字符并在每个字符上调用toupper。您可以轻松编写一个执行此操作的函数:

void strtoupper(char *str)
{
    while(toupper((unsigned char)*str++))
        ;
}

请注意unsigned char强制转换 - 所有处理字符分类和转换的C函数都需要int,它是EOF(保持不变)或者是unsigned char的值。原因是悲伤和复杂,我已经详细说明了in another answer

值得注意的是,toupper的设计无法使用多字节字符编码(例如UTF-8)可靠地工作,因此它在现代文本处理中没有真正的位置(因为通常大多数C语言环境设施都是如此(严重)设计在另一个时代)。

© www.soinside.com 2019 - 2024. All rights reserved.