代码到底错哪里了,真的快无解了

#include<iostream>
#include<string.h>
using namespace std;
class Person{
protected:
    char m_strName[10];
    int m_nAge;
    int m_nSex;
public:
    void Register(char* name, int age, char sex){
        strcpy(m_strName, name);
        m_nAge = age;
        m_nSex = sex;
    }
    char* GetName() { return m_strName; }
    int GetAge() { return m_nAge; }
    char GetSex() { return m_nSex == 0 ? 'm' : 'f'; }
    void ShowMe() {
        cout << GetName() << "\t" << GetSex() << "\t" << GetAge() << "\t" << endl;
    }
};
class Employee:public Person {
    char m_strDept[20];
    float m_fSalary;
public:
    Employee(){ EmployeeRegister("XXX", 0,'m', "XXX", 0); }
    void EmployeeRegister(char* name, int age, char sex, char* dept, float salary);
    void ShowMe();
};
void Employee::EmployeeRegister(char* name, int age, char sex, char* dept, float salary) {
    Register(name, age, sex);
    strcpy(m_strDept, dept);
    m_fSalary = salary;
}
void Employee::ShowMe() {
    cout << GetName() << "\t" << GetSex() << "\t" << GetAge() << "\t";
    cout << m_strDept << "\t" << m_fSalary << endl;
    cout << m_strName << endl;
}
void main() {
    Employee emp;
    emp.ShowMe();
    emp.EmployeeRegister("张莉", 40, 'f', "图书馆", 2000);
    emp.ShowMe();
    emp.Person::ShowMe();
    cout << "调用基类 GetName() 返回值为:" << emp.GetName() << endl;
}

img

能不能帮我看一下到底错哪里了,老是显示strcpy啥的

基于Monster 组和GPT的调写:

有几个问题需要解决:

  • #include<string.h> 语句在代码中确实是需要的,因为它包含了字符串操作函数 strcpy 的声明。但是在这个代码片段中,并没有包含 头文件,这导致了后面使用的 cout 和 endl 无法识别。所以要添加 #include 来解决这个问题。
  • 在 Person 类中,m_nSex 变量被声明为 int 类型,但在 Register 函数中使用的参数类型是 char。应该将 m_nSex 的类型更改为 char,以与函数参数匹配。
  • 在 Employee 类中的 EmployeeRegister 函数的定义中,参数类型为 char* dept,但是在函数内部的 strcpy 函数的使用中,dept 被视为字符串常量,这是不允许的。应该将 m_strDept 的类型更改为 char*,并使用 strcpy 将字符串复制到 m_strDept 中。
  • 应该使用 int main() 来定义程序的入口点,而不是 void main()。

修复后的代码如下所示:

#include <iostream>
#include <cstring>
using namespace std;

class Person {
protected:
    char m_strName[10];
    int m_nAge;
    char m_nSex;
public:
    void Register(char* name, int age, char sex) {
        strcpy(m_strName, name);
        m_nAge = age;
        m_nSex = sex;
    }
    char* GetName() { return m_strName; }
    int GetAge() { return m_nAge; }
    char GetSex() { return m_nSex == 0 ? 'm' : 'f'; }
    void ShowMe() {
        cout << GetName() << "\t" << GetSex() << "\t" << GetAge() << "\t" << endl;
    }
};

class Employee : public Person {
    char m_strDept[20];
    float m_fSalary;
public:
    Employee() { EmployeeRegister("XXX", 0, 'm', "XXX", 0); }
    void EmployeeRegister(char* name, int age, char sex, char* dept, float salary);
    void ShowMe();
};

void Employee::EmployeeRegister(char* name, int age, char sex, char* dept, float salary) {
    Register(name, age, sex);
    strcpy(m_strDept, dept);
    m_fSalary = salary;
}

void Employee::ShowMe() {
    cout << GetName() << "\t" << GetSex() << "\t" << GetAge() << "\t";
    cout << m_strDept << "\t" << m_fSalary << endl;
    cout << m_strName << endl;
}

int main() {
    Employee emp;
    emp.ShowMe();
    emp.EmployeeRegister("张莉", 40, 'f', "图书馆", 2000);
    emp.ShowMe();
    emp.Person::ShowMe();
    cout << "调用基类 GetName() 返回值为: " << emp.GetName() << endl;
    return 0;
}


运行结果:

img

函数不安全,新版本的vs对这种不安全的函数都会报错的,你可以去搜索用安全的函数代替

开头加上
#define _CRT_SECURE_NO_WARNINGS


#include<iostream>
#include<string.h>
using namespace std;
class Person{
protected:
    char m_strName[10];
    int m_nAge;
    char m_nSex;
public:
    void Register(char* name, int age, char sex){
        strcpy(m_strName, name);
        m_nAge = age;
        m_nSex = sex;
    }
    char* GetName() { return m_strName; }
    int GetAge() { return m_nAge; }
    char GetSex() { return m_nSex == 0 ? 'm' : 'f'; }
    void ShowMe() {
        cout << GetName() << "\t" << GetSex() << "\t" << GetAge() << "\t" << endl;
    }
};
class Employee:public Person {
    char m_strDept[20];
    float m_fSalary;
public:
    Employee(){ EmployeeRegister("XXX", 0,'m', "XXX", 0); }
    void EmployeeRegister(char* name, int age, char sex, char* dept, float salary);
    void ShowMe();
};
void Employee::EmployeeRegister(char* name, int age, char sex, char* dept, float salary) {
    Register(name, age, sex);
    strcpy(m_strDept, dept);
    m_fSalary = salary;
}
void Employee::ShowMe() {
    cout << GetName() << "\t" << GetSex() << "\t" << GetAge() << "\t";
    cout << m_strDept << "\t" << m_fSalary << endl;
    cout << m_strName << endl;
}
int main() {
    Employee emp;
    emp.ShowMe();
    emp.EmployeeRegister("张莉", 40, 'f', "图书馆", 2000);
    emp.ShowMe();
    emp.Person::ShowMe();
    cout << "调用基类 GetName() 返回值为:" << emp.GetName() << endl;
}
  • 帮你找了个相似的问题, 你可以看下: https://ask.csdn.net/questions/7523279
  • 我还给你找了一篇非常好的博客,你可以看看是否有帮助,链接:strcpy拷贝结构体成员中的字符数组溢出的问题
  • 除此之外, 这篇博客: 内存越界一定会导致程序崩溃吗?详解内存越界中的 1.2、执行strcpy时的写越界  部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  •        再比如我们调用C函数strcpy将一个字符串拷贝到目标buffer:

    char szDstBuf[10] = { 0 };
    char* pInfo = "this is a test";
    strcpy(szDstBuf, pInfo);

    显然这个"this is a test"字符串长度为14字节(加上\0结尾符则是15),已经超过了目标buffer szDstBuf的长度(10字节),所以执行strcpy后就发生内存越界了。你如果要将这段代码拷贝到visual studio中运行,这段代码执行后会报如下的错误:

    9b47e6200ea543f7acb8316dbfad881e.png

    即szDstBuf局部变量周边的栈内存被破坏了,为啥这么说呢?因为执行strcpy时内存越界了,篡改了szDstBuf变量后面的内存了。

  • 您还可以看一下 王桂林老师的C语言:从放弃到入门课程中的 10-4原字符串处理strcpy小节, 巩固相关知识点
  • 以下回答由chatgpt基于相关博客总结生成:

    在给出具体解决方案之前,需要获取更多关于代码错误的信息,因此需要询问以下问题以获取更多信息:

    1. 您正在使用哪种编程语言?

    2. 您使用的是哪个版本的strcpy函数?

    3. 您是否可以提供代码片段以供参考?

    根据参考资料中的信息,可以给出以下可能有用的解决方案:

    1. 确保目标字符串长度足够大,以避免出现缓冲区溢出错误。

    2. 检查源字符串和目标字符串指针是否为空。

    3. 确保您的代码中没有其他语法错误或逻辑错误,这些错误可能导致strcpy函数无法正常工作。

    4. 确保您的代码中使用的是正确版本的strcpy函数,不同版本的函数可能在实现方式上存在差异,导致错误。

    给出具体解决方案需要进一步了解关于代码错误的详细信息。