#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*
初始化。
答案 0 :(得分:2)
这可能是问题
(sizeof s)/(sizeof s[0]);
此技巧仅适用于数组,而不适用于指向数组的指针。
您应该添加一个长度参数并在构造期间传递它。或者使用strlen
查找字符串的长度(如果它是空终止的。
答案 1 :(得分:0)
我认为你正在做以下事情:sizeof(char *,一个指针)通常是4(在32位机器上),sizeof(s [0])就像sizeof(char)(32-上的1个字节)位机器),所以你总是得到4个字节。 如果您的字符串超过3个字节,程序将崩溃。 使用strlen(s)获取char * s的长度。试试吧。
答案 2 :(得分:0)
在默认构造函数中,您没有为str
分配内存,但在析构函数中调用delete [] str
。在默认构造函数中将str
设置为NULL
应修复崩溃问题:
longMath::longMath() : str(NULL), size(0)
{
}
程序不会编译,因为你没有在longMath类中声明operator=
但是已经定义了它。你需要在课堂上添加以下声明:
longMath& operator= (const longMath &a);