qq_41517828 2018-09-04 09:23 采纳率: 25.9%
浏览 523
已结题

C++编程问题请大神赐教谢谢

问一下 strcpy()那行为什么会报错
#include"stdafx.h"
#include
#include"strngbad.h"
using std::cout;

int StringBad::num_strings = 0;

StringBad::StringBad(const char*s)
{
len = std::strlen(s);
str = new char[len + 1];
std::strcpy(str, s);
num_strings++;
cout << num_strings << ":\"" << str << "\"object created\n";

}

StringBad::StringBad()
{
len = 4;
str = new char[4];
std::strcpy(str, "C++");
num_strings++;
cout << num_strings << ":\"" << str << "\"default object created\n";
}

StringBad::~StringBad()
{
cout << "\"" << str << "\"object deleted,";
--num_strings;
cout << num_strings << "left\n";
delete[]str;
}

std::ostream & operator<<(std::ostream & os, const StringBad & st)
{
os << st.str;
return os;
}

  • 写回答

2条回答

  • threenewbee 2018-09-04 16:05
    关注

    仅仅就可以通过编译的角度来说,

     #include<iostream>
    #include<string>
    using std::cout;
    
    #ifndef STRNGBAD_H_
    #define STRNGBAD_H_
    class StringBad
    {
    private:
    char*str;
    int len;
    static int num_strings;
    public:
    StringBad(const char*s);
    StringBad();
    ~StringBad();
    friend std::ostream & operator<<(std::ostream & os, const StringBad &st);
    };
    
    #endif
    
    
    
    int StringBad::num_strings = 0;
    
    StringBad::StringBad(const char*s)
    {
        len = std::strlen(s);
        str = new char[len + 1];
        std::strcpy(str, s);
        num_strings++;
        cout << num_strings << ":\"" << str << "\"object created\n";  
    }
    
    StringBad::StringBad()
    {
        len = 4;
        str = new char[4];
        std::strcpy(str, "C++");
        num_strings++;
        cout << num_strings << ":\"" << str << "\"default object created\n";
    }
    
    StringBad::~StringBad()
    {
        cout << "\"" << str << "\"object deleted,";
        --num_strings;
        cout << num_strings << "left\n";
        delete[]str;
    }
    
    std::ostream & operator<<(std::ostream & os, const StringBad & st)
    {
        os << st.str;
        return os;
    }
    
    int main()
    {}
    

    你没有main函数

    如果strcpy还有报错,是因为你用了vc++ 2012或者更新的版本,默认不允许不安全的函数。

    可以使用strcpy_s代替,修改如下:

     #include "stdafx.h"
    
    #include<iostream>
    #include<string>
    using std::cout;
    
    #ifndef STRNGBAD_H_
    #define STRNGBAD_H_
    class StringBad
    {
    private:
    char*str;
    int len;
    static int num_strings;
    public:
    StringBad(const char*s);
    StringBad();
    ~StringBad();
    friend std::ostream & operator<<(std::ostream & os, const StringBad &st);
    };
    
    #endif
    
    
    
    int StringBad::num_strings = 0;
    
    StringBad::StringBad(const char*s)
    {
        len = std::strlen(s);
        str = new char[len + 1];
        strcpy_s(str, len, s);
        num_strings++;
        cout << num_strings << ":\"" << str << "\"object created\n";  
    }
    
    StringBad::StringBad()
    {
        len = 4;
        str = new char[4];
        strcpy_s(str,len, "C++");
        num_strings++;
        cout << num_strings << ":\"" << str << "\"default object created\n";
    }
    
    StringBad::~StringBad()
    {
        cout << "\"" << str << "\"object deleted,";
        --num_strings;
        cout << num_strings << "left\n";
        delete[]str;
    }
    
    std::ostream & operator<<(std::ostream & os, const StringBad & st)
    {
        os << st.str;
        return os;
    }
    
    int main()
    {}
    
    评论

报告相同问题?

悬赏问题

  • ¥15 安装svn网络有问题怎么办
  • ¥15 Python爬取指定微博话题下的内容,保存为txt
  • ¥15 vue2登录调用后端接口如何实现
  • ¥65 永磁型步进电机PID算法
  • ¥15 sqlite 附加(attach database)加密数据库时,返回26是什么原因呢?
  • ¥88 找成都本地经验丰富懂小程序开发的技术大咖
  • ¥15 如何处理复杂数据表格的除法运算
  • ¥15 如何用stc8h1k08的片子做485数据透传的功能?(关键词-串口)
  • ¥15 有兄弟姐妹会用word插图功能制作类似citespace的图片吗?
  • ¥15 latex怎么处理论文引理引用参考文献