将大写字母转换为小写字母,为什么要加上32?将小写字母转换为大写字母,为什么要减去32?请解释。

6

这里有一段代码片段,我不明白为什么要加上或减去32来使字符大小写转换。

/******** function definition *******/
void stringLwr(char *s)
{
    int i=0;
    while(s[i]!='\0')
    {
        if(s[i]>='A' && s[i]<='Z'){
            s[i]=s[i]+32;
        }
        ++i;
    }
}

void stringUpr(char *s)
{
    int i=0;
    while(s[i]!='\0')
    {
        if(s[i]>='a' && s[i]<='z'){
            s[i]=s[i]-32;
        }
        ++i;
    }
}



为了更多参考,我在一个网站上学习了相关的IT技术:将字符串转换为大写和小写的C程序。


奇怪。通常使用位翻转来使初学者更难理解 - s[i]=s[i] ^ 32 - Alexei Levenkov
这都与字符集编码有关。人们会告诉你ASCII,但你真的应该找出你想在程序中支持哪种编码,并将其记录下来——可能它应该与你的终端匹配。在Linux中运行locale;在Windows中运行chcp以了解你正在使用的编码。标准C库被设计用于处理许多这样的编码,所以一旦你学会了它们的功能,就可以使用它们。 - Tom Blodget
“32” 是糟糕的编程实践的一个例子:它是一个魔法数字。如果你不得不询问,这说明程序可能需要更清晰,正如 @RSahu 的回答所示。 - Tom Blodget
5个回答

6
a-z的ASCII代码是97-122。
A-Z的ASCII代码是65-90。
要从a得到A,需要减去32。
要从A得到a,需要加上32。
为了使代码更清晰一些,您可以使用:
        s[i] += ('a' - 'A');
        // 'a' = 'A' + ('a' - 'A');

当将大写字母转换为小写字母时,

        s[i] += ('A' - 'a');
        // 'A' = 'a' + ('A' - 'a');

将小写字母转换为大写字母时。


你猜想在这行代码中的“add”应该是“subtract”,即“要从a得到A,需要从a中减去32”。 - Erobrere

1
所有的奥秘都在ASCII代码中。 A = 65 a=97的代码。 所以现在改变只意味着加上或减去32。就是这样。
            Difference
A=65  a=97  32
B=66  b=98  32
C=67  c=99  32
D=68  d=100 32
...   ...
..    ..

顺便说一下,这是任何基础的C/C++书籍的一部分。
现在,如果您想从'a'更改为'A',则必须减去32,因为那是ascii代码对应于'A'的值。
'A'到'a'的逻辑类似(加32)。
另一件事是,'a'给我们提供了数字ascii值。
printf("%c", 66); ===> b
printf("%d", 'c');===> 67

0

大写字母 A 的 ASCII 值为 65,小写字母 a 的 ASCII 值为 97。 因此, 65 + 32 = 97 可以得到对应的小写字母。 97 - 32 = 65 可以得到对应的大写字母。

你可以查看http://www.asciitable.com/


0
为什么不使用ctype.h中的函数呢?

0

正如其他答案所说,这是因为每个小写字母的ASCII表示比相应大写字母的表示大32。

依赖此方法通常不是一个好主意。除了ASCII之外还有其他字符集;例如,在EBCDIC中,这种方法将无法工作。

标准函数touppertolower<ctype.h>中声明,可以可移植地将字符转换为大写或小写(并将非字母映射为它们自己)。与其使用上述方法,不如使用这些函数。

if(s[i]>='A' && s[i]<='Z'){
    s[i]=s[i]+32;
}

你可以写:

s[i] = toupper((unsigned char)s[i]);

(需要将类型转换为unsigned char,因为这些函数定义中存在不幸的故障。)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接