2
#pragma once
# include <iostream>
# include <string>
# include <cstring>

using namespace std;
const int err=404;

class longMath{
protected:
    char* str;
    int size;

protected:
    //void create(int len);
public:
    inline longMath();
    inline longMath(longMath &a);
    inline longMath(char* s);
    inline longMath(string &s);
    ~longMath(){delete [] str;}
    void print();
};  
    //-------------------------------------------------------------//


longMath::longMath(){size=0;}

longMath::longMath(longMath &a){
    str = new char [a.size];
    strncpy(str,a.str,a.size);
    size= a.size;
}

longMath::longMath(char* s){
    size = (sizeof s)/(sizeof s[0]);
    str = new char [size+1];
    strncpy_s(str,size+1,s,size);
}

void longMath::print(){
    for (int i=0;i<size;i++){
        cout<<*(str+i);
    }
    cout<<endl;
}

longMath::longMath(string &s){
    str = new char [s.length()];
    for (int i=0;i<size;i++){
        *(str+i)=s[i];
    }
    size = s.length();
}

longMath longMath::operator= (const longMath &a){//оператор присвоения
    if (this==&a) return *this;
    delete [] str;
    str = new char [a.size];
    strncpy(str,a.str,a.size);
    size = a.size;
    return *this;
}

//----------additional function--------------------//
int switcher(char &c){
    switch (c){
    case '1': return 1; break;
    case '2': return 2; break;  
    case '3': return 3; break;
    case '4': return 4; break;
    case '5': return 5; break;
    case '6': return 6; break;
    case '7': return 7; break;
    case '8': return 8; break;
    case '9': return 9; break;
    case '0': return 0; break;
    default: return err;
    }
}

还有另一个主文件

# include <iostream>
# include "longMath.h"
using namespace std;

int main(){
    char* s("regw");

    longMath h,n(s);
    n.print();

    system("PAUSE");
    return 0;
}

该程序不想编译,它返回异常0x0f8657aa (msvcr100d.dll)

请帮帮我。程序似乎不太复杂。构造函数有问题,初始化为char*.

4

3 回答 3

2

这可能是问题

(sizeof s)/(sizeof s[0]);

此技巧仅适用于数组,不适用于指向数组的指针。

您应该添加一个长度参数并在构造期间将其传递。或者用于strlen查找字符串的长度,如果它是空终止的。

于 2013-02-08T07:47:39.277 回答
0

我认为您正在执行以下操作: sizeof(char*, a pointer) 通常为 4(在 32 位机器上), sizeof(s[0]) 就像 sizeof(char) (在 32 位机器上为 1 个字节) ,所以你总是得到 4 个字节。如果你的字符串超过 3 个字节,程序就会崩溃。使用 strlen(s) 获取 char* s 的长度。试试看。

于 2013-02-08T07:56:25.900 回答
0

在您的默认构造函数中,您没有分配内存,str而是调用delete [] str了析构函数。在默认构造函数中设置strNULL应该修复崩溃问题:

longMath::longMath() : str(NULL), size(0)
{
}

该程序不会编译,因为您没有operator=在 longMath 类中声明而是定义了它。您需要在类中添加以下声明:

longMath& operator= (const longMath &a);
于 2013-02-08T08:40:58.107 回答