Ras*_*ami 8 c++ string lowercase uppercase
int main()
{
string s;
cout << "enter the string :" << endl;
cin >> s;
for (int i = 0; i < s.length(); i++)
s[i] ^= 32;
cout << "modified string is : " << s << endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我看到这个代码在stackoverflow上将大写转换为小写.
但我不明白这条线s[i] = s[i]^32
.
它是如何工作的?
πάν*_*ῥεῖ 16
它是如何工作的?
让我们看看ASCII值'A'
:
'A'
是二进制的 1000001
XORed with 32(二进制100000
)
产生任何未设置高位字符指示位的值:
1000001
ASCII中的
XOR
100000
= 1100001
== 'a'
.
任何理智和可移植的c或c ++应用程序都应该使用tolower()
:
int main()
{
string s;
cout<<"enter the string :"<<endl;
cin>>s;
for (int i=0;i<s.length();i++) s[i] = tolower( (unsigned char)s[i] );
// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
cout<<"modified string is : "<<s<<endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
将s[i]=s[i]^32
(货物邪教)魔法,依赖于ASCII表具体映射的数字char
值.
还有其他char
代码表,例如EBCDIC
,其中
s[i]=s[i]^32
Run Code Online (Sandbox Code Playgroud)
方法很难找回相应的小写字母.
有一个更复杂的c ++版本转换为小写字符显示在参考文档页面中std::ctype::tolower()
.
在C++中,与其前身C一样,a char
是数字类型.这毕竟是如何在硬件上表示字符,这些语言不会隐藏这些字符.
在ASCII中,字母具有有用的属性,即大写和小写字母之间的差异是单个二进制位:第5位(如果我们从0开始从右开始编号).
大写字母A由字节0b01000001
(0x41
十六进制)表示,小写字母a由字节0b01100001
(0x61
十六进制)表示.请注意,大写和小写A之间的唯一区别是第五位.这种模式从B到Z继续.
因此,当你^= 32
在一个代表ASCII字符的数字上(顺便说一下,是2到5次方)时,它做的是切换第5位 - 如果它是0,它变为1,反之亦然,这会改变从大写到小写的字符,反之亦然.