我想知道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;
}

如果我用“一二”来测试,结果是“一二”,而不是“一二”。任何建议都很感激。

最佳答案

toupper将单个字母转换为大写。在您的例子中,由于C在隐式转换中的宽恕,您传递的是一个指针,而不是一个char,所以很明显它不能正确工作。可能您得到了一个“不带强制转换的隐式整数转换指针”警告:这是一个很强的信号,表明您做了非常错误的事情。
整件事并不是因为在你的平台上int和指针一样大(或者至少对于你正在使用的指针来说足够大);toupper试图将int解释为一个字符,发现它是非字母的,并将其原封不动地返回。这纯粹是运气,在其他平台上,您的程序可能会崩溃,因为指向int转换的指针被截断,而且toupper范围之外的整数(加上unsigned char)上的EOF行为是未定义的。
要将整个字符串转换为大写,必须遍历它的所有字符并对每个字符调用toupper。您可以轻松编写这样一个函数:

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

注意,处理字符分类和转换的cast-all C函数需要一个unsigned char(保持原样)或int的值。原因是悲伤和复杂的,我已经详细说明了。
不过,值得注意的是,EOF在设计上不能可靠地与多字节字符编码(如UTF-8)一起工作,因此它在现代文本处理中没有实际的地位(一般来说,大多数C语言环境设施是在另一个时代(糟糕地)设计的)。

关于c - 上层功能,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/15057899/

10-11 15:38