使用位运算符转换为大写

标签 c

您好,我有一个将字符转换为大写的函数,但不理解这行代码 *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/

相关文章:

c - Ubuntu 中的 skbuff.h 文件在哪里?

c - 用&&​​声明的int,if else总是返回true

c - 重置 TCP KeepAlive 定时器

c - 当我删除 "int e = 0;"时出现段错误

c - 如何比较结构的两个实例

c - 结构上的指定初始化程序会导致 strcpy 和 realloc 中出现段错误

复合 IF 语句作用域

c - 在 C 中验证输入

c - 如果 a 是数组,函数 (1,a+2) 中的加法是什么意思?

比较 WCHAR String 和 C 中的 Const Char?