return0;
}
一个典型的运行结果:
变量
内容
首地址
长度(字节)
cval
‘A’
0x0012ff64
1
cp
0x0012ff64
0x0012ff68
4
dval
99.9
0x0012ff6c
8
dp
0x0012ff6c
0x0012ff74
4
ival
100
0x0012ff78
4
ip
0x0012ff78
0x0012ff7c
4
内存分配解释:
速度优化时通常以字(4字节)为单位(开始地址可被4整除)给变量安排内存。
cval仅用一个字节,也安排了4个字节。
5.8分别编写下列字符串处理函数
(1)char*strcat1(char*s,constchar*ct);
将串ct接到串s的后面,形成一个长串。
【例6.7】以数组为参数,现用指针为参数。
(2)intstrlen1(constchar*s);
求字符串长度的函数,返回串长(不包括串结束符)。
(3)char*reverse(char*);
反置字符串s,即可将“break”成为“kaerb”。
(4)char*strchr(constchar*cs,charc);
查找字符c在串cs中第一次出现的位置,返回指向该字符的指针,若没有出现则返回NULL。
(5)char*strstr(constchar*cs1,constchar*cs2);
返回串cs2作为子串在cs1中第一次出现的位置,若没有出现则返回NULL。
解:
为了函数的通用性,有些可不要返回值的函数,也保留返回值。
反置字符串函数,从串两头的指针同时向中间移动,重合或交错时停止。
查找子串,先找子串的第一个字符,再核对子串其他字符。
查找子串函数是比较难的。
查找分两重循环,第1重主串与子串第1个字符比较,当顺序找到主串中有字符与子串第1个字符相符时,进入第2重循环对所有字符进行比较,比较时要借助工作变量,成功则返回子串所在位置,本轮失败,则主串后移一个字符,回到第1重循环。
在使用++运算符时一定要单用,如本例中:
while(*temp==*temp1&&*temp1){temp++;temp1++;};
if(*temp1==0)return(char*)cs1;
千万不可简化为:
while(*temp++==*temp1++&&*temp1);
if(*temp1==0)return(char*)cs1;
这里有微妙的差异,主串与子串最后一个字符不同也认为子串找到了。
#include
usingnamespacestd;
char*strcat1(char*s,constchar*ct){
char*st=s;
while(*s)s++;//*s作为条件,等效*s!
=0
while(*s++=*ct++);
returnst;
}
intstrlen1(constchar*s){
inti=0;
while(*s++)i++;
returni;
}
char*reverse(char*s){
chartemp,*temp1=s,*temp2=s;
while(*temp2)temp2++;
temp2--;//指针移回串尾
while(temp2-temp1>0){//注意此处,从串两头的指针同时向中间移动,重合或交错时停止
temp=*temp1;
*temp1=*temp2;
*temp2=temp;
temp1++;
temp2--;
}
returns;
}
char*strchr(constchar*cs,charc){
while(*cs!
=c&&*cs)cs++;
if(*cs==0)cs=NULL;//未找到返回NALL
return(char*)cs;
}
char*strstr(constchar*cs1,constchar*cs2){
char*temp,*temp1;
while(*cs1){//只要主串还有字符未查,则继续
while(*cs1!
=*cs2&&*cs1)cs1++;
//与子串第1个字符不符,主串查找位置后移一个字符
//找到主串含有子串的第一个字符,或主串查完停止
if(*cs1){//主串含有子串的第一个字符,核对子串全部字符
temp=(char*)cs1;
temp1=(char*)cs2;
while(*temp==*temp1&&*temp1){temp++;temp1++;};
if(*temp1==0)return(char*)cs1;//找到子串返回
elsecs1++;//本轮未找到,主串查找位置后移一个字符
}
}
returnNULL;//返回NALL
}
intmain(){
chara[40]="束明";
charb[20]="是东南大学学生";
charc[40]="SoutheastUniversity";
char*cp;
cout<cout<
strcat1(a,b);
cout<<"字符串连接后:
"<cout<cout<<"字符串长度为:
"<cout<cp=strchr(c,'U');
if(cp==NULL)cout<<"未找到"<elsecout<cp=strchr(c,'A');
if(cp==NULL)cout<<"未找到"<elsecout<cout<cp=strstr(a,"是");
if(cp!
=NULL)cout<elsecout<<"未找到"<cp=strstr(a,"大学生");
if(cp==NULL)cout<<"未找到"<elsecout<return0;
}
5.9使用递归和非递归的两种方法编写函数
char*itoa(intn,char*string);
将整数n转换为十进制表示的字符串。
(在非递归方法中,可使用reverse()函数。
)
解:
递归方法分析。
难度大,可用图解法:
每次调用除以10,以去除最后一位,以n=3657为例。
由此图可见,由string指向应填入的字符数组的相应位置。
由调用的最底层开始,回归时填入,每次回归,指针后移一位,由此得
char*itoal(intn,char*string){
if(n/10)string=itoal(n/10,string);
*string++=n%10+48;//字符,ASCII码
returnstring;
}
考虑,数字串结束符和负数,得完整的函数。
char*itoal(intn,char*string){