问答题 凡是使用过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,判断条件为当前字符不是字符串结束符。