//以下程序是实现小写转大写程序
#include<stdio.h>
void to_upper(char *str)
{
for(;*str !='/0';str++)
{
if(unsigned(*str-'a')<='z'-'a')
*str-='a'-'A';//小写转成大写
}
}
void main()
{
char *str="Are you ready?";
to_upper(str);
printf("%s/n",str);
}
以上程序在编译和连接都通过了,但却得不出结果!!
char *str="Are you ready?";对应的汇编
004010A8 mov dword ptr [ebp-4],offset string "Are you ready?" (00422020)
改正为:
#include<stdio.h>
void to_upper(char *str)
{
for(;*str !='/0';str++)
{
if(unsigned(*str-'a')<='z'-'a')
*str-='a'-'A';//小写转成大写
}
}
void main()
{
char str[]="Are you ready?";
to_upper(str);
printf("%s/n",str);
}
输出:ARE YOU READY?
char str[]="Are you ready?"对应的汇编:
004010A8 mov eax,[string "Are you ready?" (00422020)]
004010AD mov dword ptr [ebp-10h],eax
004010B0 mov ecx,dword ptr [string "Are you ready?"+4 (00422024)]
004010B6 mov dword ptr [ebp-0Ch],ecx
004010B9 mov edx,dword ptr [string "Are you ready?"+8 (00422028)]
004010BF mov dword ptr [ebp-8],edx
004010C2 mov ax,[string "Are you ready?"+0Ch (0042202c)]
004010C8 mov word ptr [ebp-4],ax
004010CC mov cl,byte ptr [string "Are you ready?"+0Eh (0042202e)]
004010D2 mov byte ptr [ebp-2],cl
现分析如下:
char str[]="Are you ready?"
char *str="Are you ready?"
第一个str是一个字符数组,你可以对数组元素进行修改,而指针str指向一个字符串常量 ,它是不可修改的;