小写字母转大写字母

4
如何使用位掩码将小写ASCII字符转换为大写(不允许使用-32)?
我不是要求解决我的作业,只是需要一些提示。
谢谢。
8个回答

15

你说“(不允许-32)”,我猜你知道小写字符和大写字符之间的差距是32。现在把32转换成二进制表示,只有一个位被设置为1。然后,想出一种使用位掩码来切换该位的方法。


2
事实上,虽然当然有人在下面直接给出了答案😊。我认为值得注意的是,对于任何读者来说,原帖确实指明了ASCII字符。因此,这种方法或者在本页上提供的任何方法,并不一定适用于非英文Unicode(16位/宽字符)字符。我只是想澄清一下这一点。它对英文有效,但对其他语言就不确定了。所以,请小心,并记住并不是所有人都会说英语,我们的通用翻译器还未发明出来😉。应该使用CRT toupper和tolower函数来处理字符。 - dyasta

4

考虑小写和大写之间的差异(0x20),然后将适当的掩码应用于您的值

XOR可从大写转换为小写,也可从小写转换为大写


2
或者只是使用异或运算符来解决;) - schnaader
再次强调,如果你要胡乱地对答案进行负面评价,请解释原因。 - KevinDTimm

3

对于实际的代码,你应该使用库函数,例如toupper()或towupper(),或者使用能够处理Unicode复杂性的其他工具。


1
+1 以补偿那些在这里疯狂奔跑并投票反对正确答案的人。 - Jens Gustedt
@9090 很多实际问题确实局限于ASCII。挥舞着你的手杖,说着类似于“你这些该死的孩子们会用ASCII把人的眼睛弄瞎”的话并不是真正有用的。 - Craig Barnes

2

+-32转换成位运算。可以用2^x来表示32


0
比较小写ASCII字符的十六进制值和大写ASCII字符的十六进制值,解决方案就会变得清晰明了。如果解决方案不明显,比较二进制值也可能有所帮助。

0
从一个小写拉丁字母的ASCII码中减去32的操作会将第5位由1翻转为0。

不,它只影响一个比特位:32 = 0x20 = 00100000。 - KevinDTimm
你说得对,在小写拉丁字母集合中,第5位始终为1。抱歉,我被国际语言经验冲昏了头脑。这甚至更加简单明了。 - Seva Alekseyev

0

由于您的规定不够明确,因此您的作业并不完整。C标准对源代码或执行字符集的特定编码一无所知,尤其是它不会假设任何与ASCII相似的东西。

因此,wnoise是正确的,处理这些问题的唯一标准方法是使用为此提供的预定义函数和宏。


1
从OP那里,“如何将小写ASCII字符转换为大写”。从'man ascii' - “ASCII是美国信息交换标准代码。它是一个7位代码。” OP不想要标准方法,OP想使用位掩码将ASCII字符从小写转换为大写。在许多情况下,这是一种简单的方式,可以帮助人们逐渐了解位掩码,因为他们可以看到其确切的影响。 - KevinDTimm
同意,考虑到他在主题中定义了ASCII,他是可以被原谅的 ;) - dyasta

-1
尝试并使用0xDF(十六进制)或01101111(二进制)。

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