上面代码中的nam必须为char*定义
时间: 2024-02-13 19:59:49 浏览: 21
如果你想继续使用指针来接收用户输入的新名字,可以将`modify_name()`函数中的代码修改为如下所示:
```
void modify_name() {
char* nam = new char[20];
cin >> nam;
delete[] name;
name = new char[strlen(nam) + 1];
strcpy(name, nam);
delete[] nam;
}
```
在这个版本的代码中,我们首先为`nam`指针分配了内存空间,然后使用`cin`将用户输入的新名字存储到`nam`指向的内存空间中。接着,我们释放了原来`name`指向的内存空间,然后为`name`指针分配新的内存空间,并将`nam`指向的内存空间中的字符串复制到`name`指向的内存空间中。最后,我们使用`delete[]`释放了`nam`指向的内存空间,避免了内存泄漏的问题。
需要注意的是,在使用指针来接收用户输入的新名字时,我们需要为`nam`指针分配内存空间,并在使用完毕后使用`delete[]`释放内存空间,否则会导致内存泄漏的问题。另外,由于`nam`指针只在`modify_name()`函数中使用,因此可以将其定义为局部变量,避免了在函数外部使用指针时发生未定义行为的问题。
相关问题
#define _CRT_SECURE_NO_WARNINGS #include<iostream> #include<string> #include<string.h> using namespace std; class student { private: long num; char* name; string major; char Class[4]; public: student(const char* nam); void show_stu(); }; student::student(const char* nam) { name = new char[strlen(nam) + 1]; strcpy(name, nam); cout << "分别输入学号和姓名: " << endl; cin >> num; cin >> name; cout << "输入专业:" << endl; cin >> major; cout << "输入班级:" << endl; cin >> Class[4]; } void student::show_stu() { cout << "学生信息: " << num << " " << name << endl; cout << " " << major << " " << Class[4] << endl; } class leader:public student { private: string position; public: leader(const char* na) :student(na); }; leader::leader(const char* na) { cout << "输入职位:" << endl; cin >> positon; } int main() { student a("fakeeeeee"); a.show_stu(); leader b("fakeeeeee"); return 0; }帮我找出上面c++代码的bug
这段代码有一些错误:
1. 在 `student` 类中,`cin >> name` 会将已经通过 `new` 分配的内存丢失,应该改为 `cin >> name + 1`。
2. 在 `student` 类中,`cin >> Class[4]` 会导致越界访问,应该改为 `cin >> Class`。
3. 在 `leader` 类中,构造函数的声明应该为 `leader(const char* na) :student(na) {}`,而不是 `leader(const char* na) :student(na);`。
4. 在 `leader` 类中,`cin >> positon` 应该改为 `cin >> position`。
修改后的代码如下:
```
#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include<string>
#include<string.h>
using namespace std;
class student {
private:
long num;
char* name;
string major;
char Class[4];
public:
student(const char* nam);
void show_stu();
};
student::student(const char* nam) {
name = new char[strlen(nam) + 1];
strcpy(name, nam);
cout << "分别输入学号和姓名: " << endl;
cin >> num;
cin >> name + 1;
cout << "输入专业:" << endl;
cin >> major;
cout << "输入班级:" << endl;
cin >> Class;
}
void student::show_stu() {
cout << "学生信息: " << num << " " << name << endl;
cout << " " << major << " " << Class << endl;
}
class leader : public student {
private:
string position;
public:
leader(const char* na) : student(na) {};
};
int main() {
student a("fakeeeeee");
a.show_stu();
leader b("fakeeeeee");
return 0;
}
```
#include<iostream> #include<string> #include<string.h> using namespace std; class Student { private: long num; int age; char* name; public: Student(long n,int a,const char* nam) { num=n; age=a; name=new char[strlen(nam)+1]; strcpy(name,nam); } void show_Student () { cout<<num<<" "<<age<<" "<<name<<" "<<endl; } void modify_name () { char* nam; cin>>nam; delete []name; name=new char[strlen(nam)+1]; strcpy(name,nam); } }; int main() { Student a(20222484,18,"lyc"); a.show_Student(); a.modify_name(); a.show_Student(); return 0; }优化上面代码
以下是优化后的代码:
```cpp
#include<iostream>
#include<string>
#include<cstring> // 使用cstring头文件代替string.h
using namespace std;
class Student {
private:
long num;
int age;
string name; // 使用string代替char*
public:
Student(long n, int a, const string& nam) : num(n), age(a), name(nam) {} // 使用初始化列表
void show_Student() {
cout << num << " " << age << " " << name << " " << endl;
}
void modify_name() {
string nam;
cin >> nam;
name = nam;
}
};
int main() {
Student a(20222484, 18, "lyc");
a.show_Student();
a.modify_name();
a.show_Student();
return 0;
}
```
优化的点如下:
1. 使用了string代替char*,避免手动内存管理和越界访问等问题。
2. 使用了初始化列表,避免在构造函数内部对成员变量进行赋值,提高代码效率。
3. 使用了cstring头文件代替string.h,cstring是C++中的标准头文件,string.h是C语言的头文件,虽然两者都可以使用,但是cstring更符合C++的风格。