问答题
凡是使用过C语言标准库函数strcpy(char*s1,char*s2)的程序员都知道,使用该函数时有一个安全隐患,即当指针s1所指向的空间不能容纳字符串s2的内容时,将发生内存错误。类Stung的Strcpy成员函数能进行简单的动态内存管理,其内存管理策略为:①若已有空间能容纳新字符串,则直接进行字符串复制;②若已有空间不够时,将重新申请一块内存空间(能容纳下新字符串),并将新字符串内容复制到新申请的空间中,释放原字符串空间。
请使用VC6或使用[答题]菜单打开考生文件夹proj2下的工程proj2,此工程中含有一个源程序文件proj2.cpp。其中定义了类String和用于测试该类的主函数main,且成员函数Strepy的部分实现代码也已在该文件中给出,请在标有注释“//TODO:”的行中添加适当的代码,将这个函数补充完整,以实现其功能。
注意:只在指定位置编写适当代码,不要改动程序中的其他内容,也不要删除或移动“//****found****”。
// proj2.cpp
#include <iostream>
using namespace std;
class String {
private:
int size; //缓冲区大小
char * buf; //缓冲
public:
String(int bufsize);
void Strcpy(char * s); //将字符串
s复制到buf中
void Print() const;
~String()
{ if (buf != NULL) delete [] buf; }
};
String::String (int bufsize)
{
size = bufsize;
bur = new char[size];
* buf = '/0';
}
void String::Strcpy (char * s)
{
char * p,* q;
int fen = strlen(s);
if (len+1 > size) { //缓冲区空间不够,须安排更大空间
size = len+1;
p = q = new char[ size];
//********** found**********
while((* q=* s) !=0) {______}
//TODO: 添加代码将字符串s复制到字符指针q中
delete [] buf;
buf = p;
}
else {
//**********found**********
for(p=buf; ______; p++, s++);
//TODO: 添加代码将字符串s复制到buf中
}
}
void String::Print() const
{
cout << size << '/t' << buf <<endl;
}
int main ()
{
char s[100];
String str (32);
cin.getline(s, 99);
str.Strcpy(s);
str.Print ();
return 0;
}
【正确答案】(1)++q;++s;
(2)(*p=*s)!=0
【答案解析】[考点] 本题考查string类,其中涉及动态数组、构造函数、成员函数、const函数和析构函数。
[解析] (1)主要考查考生对while循环的掌握,先看语句注释:添加代码将字符串s复制到字符指针q中。程序已经给出了赋值语句,这里只要使q和s递增即可。
(2)主要考查考生对for循环的掌握,先看语句注释:添加代码将字符串s复制到bur中。因为循环体中没有语句,直接用分号结束,因此需要在循环条件中完成赋值,同时进行条件判断,赋值语句为*p=*s,判断条件为当前字符不是字符串结束符。