我想知道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;
}
如果我用“一二”进行测试,则会产生“一两”,而不是“一两”。任何建议都表示赞赏。
答案 0 :(得分:4)
toupper
将单个字母转换为大写。在你的情况下,由于隐式转换中C的宽恕,你传递一个指向它而不是char
的指针,因此很明显它无法正常工作。可能你会得到一个“没有强制转换的整数转换的隐式指针”警告:这是一个强烈的迹象,表明你做错了。
整个事情并没有因为你的平台int
和指针一样大(或者至少对你正在使用的那些指针足够大)而爆炸; toupper
尝试将int
解释为一个字符,发现它是非字母的并且未经修改就返回它。这绝对是运气,在其他平台上你的程序可能会崩溃,因为指向int
转换的指针被截断,并且toupper
对unsigned char
范围之外的整数的行为(加{ {1}})未定义。
要将整个字符串转换为大写字母,您必须遍历其所有字符并在每个字符上调用EOF
。您可以轻松编写执行此操作的函数:
toupper
请注意void strtoupper(char *str)
{
while(toupper((unsigned char)*str++))
;
}
强制转换 - 处理字符分类和转换的所有C函数要求 unsigned char
int
(保持不变)或是EOF
的值。原因是悲伤和复杂,我已经详细说明了in another answer。
但值得注意的是,unsigned char
按设计无法使用多字节字符编码(例如UTF-8)可靠地工作,因此它在现代文本处理中没有真正的位置(如一般来说,大多数C语言环境设施都是(在另一个时代设计的)。(