您好,我有一个将字符转换为大写的函数,但不理解这行代码 *src & = ~0x20
。
完整代码如下
void upper_case(char *src)
{
while (*src != '\0')
{
if (islower(*src))
*src &= ~0x20;
src++;
}
}
谢谢
最佳答案
这是一个 ASCII 解决方案,从小写字符的整数值中减去 32,等于它的大写字母。
它不适用于所有字符集/编码。如果你的环境/语言环境是“C”语言环境,或“En_US”,这将起作用,否则可能不是因为不是每个字符集都有 0x20 (32) 大小写之间的关系,也没有大写或小写的概念案例。
就此而言,即使使用 ASCII,由于重音字符和其他问题,islower() 也不是安全检查(我看到 Ray Chen 刚刚在评论中指出)。我会改用
if(ch >= 'a' && ch <= 'z') // this == islower() in "C" locale, but not others
限制集合以避免重音字符。 islower() 不保证 -32 会大写。
无论如何,这是“老办法”,遗憾的是,它已经取代了许多其他“简单”技巧和假设,例如 .txt 表示 ASCII。
查看 http://blogs.msdn.com/b/oldnewthing/archive/2007/04/17/2158334.aspx有趣的阅读。
关于使用位运算符转换为大写,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24481483/