首先用C(C++)语言对字符串的中的字符进行大小写转换时,需要对字母的阿斯克码进行比较,如果是大写转换成小写,相应的要加32,反之减32。
代码如下:
#include
using namespace std;
int main()
{
char
s1[]="IAmTheSuperStar";
char
s2[]="IAmTheSuperStar";
cout<
cout<
int i;
for(i=0;i
if(s1[i]>='a'&&s1[i]<='z') s1[i]=s1[i]-32;
cout<
cout<
for(i=0;i
if(s2[i]>='A'&&s2[i]<='Z') s2[i]=s2[i]+32;
cout<
system("pause");
return
0;
}
精简代码:
#include
using namespace std;
int main()
{
char
s1[]="IAmTheSuperStar";
char
s2[]="IAmTheSuperStar";
cout<
int i;
for(i=0;i
{
s1[i]=s1[i]&0xDF;//小写字母转换成大写字母
s2[i]=s2[i]|0x20;//大写字母转换成小写字母
}
cout<
cout<
cout<
cout<
system("pause");
return
0;
}
PS:由于空格处理起来会产生偏差,所以字符串里就不安排空格了,就从编程复杂度来讲并没有怎么降低,只是从汇编的思想来解释为什么“s1[i]=s1[i]&0xDF;//小写字母转换成大写字母
s2[i]=s2[i]|0x20;//大写字母转换成小写字母 ”。下面来解释这两行代码:
我们知道小写字母的ASCⅡ码值比大写字母的ASCⅡ码值大20H,即32。如果将“a”的ASCⅡ码值减去20H,就可以得到“A”;反之亦然。可以看出,就ASCⅡ码的二进制形式来看,除第5位(位数从0开始计算)外,大写字母和小写字母的其他各位都一样。只是大写字母ASCⅡ码的第5位为0,0000|0000|0000|0000;而小写字母的ASCⅡ码的第5位为1,0000|0000|0100|0000。这样我们就有了新的方法,一个字母,不管原来是大写还是小写,将它的第5位置0,它就必将变成大写字母;将它的第5位置1,它就必将变成小写字母。在这个方法中,我们不需要在处理前判断字母的大小写。
完整的汇编程序:
assume cs:codesg,ds:datasg
datasg segment
db 'BaSic'
db 'iNfOrMaTiOn'
datasg ends
codesg segment
start: mov ax,datasg
mov ds,ax ;设置ds指向datasg段
mov
bx,0 ;设置(bx)=0,ds:bx指向'BaSiC'的第一个字母
mov
cx,5 ;设置循环次数5,因为'BaSiC'有5个字母
s:mov a1,[bx] ;将ASCⅡ码从ds:bx所指向的单元中取出
and
a1,11011111B ;将al中的ASCⅡ码的第5位置为0,变为大写字母
mov [bx],a1 ;将转变后的ASCⅡ码写回原单元
inc
bx ;(bx)加1,ds:bx指向下一个字母
loop s
mov
bx,5 ;设置(bx)=5,ds:bx指向'iNfOrMaTiOn'的第一个字母
mov cx,11 ;设置循环次数11,因为'iNfOrMaTiOn'有11个字母
s0:mov
a1,[bx]
or a1,00100000B ;将al中的ASCⅡ码的第5位置为1,变为小写字母
mov
[bx],a1
inc bx
loop s0
mov ax,4c00h
int 21h
codesg ends
end start
此汇编代码来自汇编语言(第2版)--王爽著,一本学习汇编语言非常好的入门书,作者是计算机科学教育家和哲学家,所以书写得很易懂,看完一遍受益匪浅,一本好处,读起来应该是有趣的!