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