朋友发来一个对输入字串中的特定字串替换的例程,说该例程在VC++6.0下编译通过,但是运行结果却有误。
例程如下:
/*输入一串小于81的字串,输出将输入字串中的"BOY"替换成"CHILD"输出*/
#include<iostream.h>
#include<string.h>
void main()
{
char s[81],t[150];
int i=0,j=0;
cin.getline(s,81);
while(i<81 && j<150)
{
if(s[i]=='/0')
{
break;
}
#include<string.h>
void main()
{
char s[81],t[150];
int i=0,j=0;
cin.getline(s,81);
while(i<81 && j<150)
{
if(s[i]=='/0')
{
break;
}
if(s[i]=='B' && s[i+1]=='O' && s[i+2]=='Y')
{
t[j]='C';
t[j+1]='H';
t[j+2]='I';
t[j+3]='L';
t[j+4]='D';
j=j+5;
i=i+3;
}
else
{
t[j]=s[i];
j=j+1;
i=i+1;
}
}
//t[i]='/0';
cout<<t<<endl;
}
{
t[j]='C';
t[j+1]='H';
t[j+2]='I';
t[j+3]='L';
t[j+4]='D';
j=j+5;
i=i+3;
}
else
{
t[j]=s[i];
j=j+1;
i=i+1;
}
}
//t[i]='/0';
cout<<t<<endl;
}
经检查后发现,原因是因为在输出字串t[]中缺少结符‘/0’,在字串符的输出中,输出函数将检查是否有‘/0’,如果有,则认为字串结束,停止输出,否则读取下一个字符,直到‘/0’出现。而在上述程序中,源字串s[]在出现‘/0’后则直接跳出循环,这时就出现了一个问题,目的字串t[]没有接收到来自s[]的结束符。在输出的时候,输出函数依然会以‘/0’为字串的结束符,在s[]应该结束的时候却没有出现'/0',输出函数将会继续往下读,直到一个‘/0’出现为止,而这个‘/0’在什么为止出现,这完全是不可预料的,假如在离s[]很远的地方才出现第一个‘/0’,那么此程序将会输出很大量的字符。
修改后的程序如下:
#include<iostream.h>
#include<string.h>
void main()
{
char s[81],t[150];
int i=0,j=0;
cin.getline(s,81);
while(i<81 && j<150)
{
if(s[i]=='/0')
{
t[i]='/0' ; //在跳出循环前給t[i]='/0'
break;
}
#include<string.h>
void main()
{
char s[81],t[150];
int i=0,j=0;
cin.getline(s,81);
while(i<81 && j<150)
{
if(s[i]=='/0')
{
t[i]='/0' ; //在跳出循环前給t[i]='/0'
break;
}
if(s[i]=='B' && s[i+1]=='O' && s[i+2]=='Y')
{
t[j]='C';
t[j+1]='H';
t[j+2]='I';
t[j+3]='L';
t[j+4]='D';
j=j+5;
i=i+3;
}
else
{
t[j]=s[i];
j=j+1;
i=i+1;
}
}
//t[i]='/0';
cout<<t<<endl;
}
{
t[j]='C';
t[j+1]='H';
t[j+2]='I';
t[j+3]='L';
t[j+4]='D';
j=j+5;
i=i+3;
}
else
{
t[j]=s[i];
j=j+1;
i=i+1;
}
}
//t[i]='/0';
cout<<t<<endl;
}