奇怪的运行时错误 我运行我的裸露C++程序有问题。它是一个BigInt类,接收字符串作为输入,并将每个数字设置为动态数组。到目前为止,我所要做的就是输入一个BigInt,然后输出它…非常简单。我的程序编译和运行很好,但一旦我输入第一个输入,它就会给我一个奇怪的错误……”这个应用程序请求运行时以一种不寻常的方式终止它。 有关详细信息,请与应用程序的支持团队联系。”
我不知道该如何处理这个问题,因为我无法在代码中找到任何缺陷 有人有什么想法吗 这是我的密码: 头文件:奇怪的运行时错误 我运行我的裸露C++程序有问题。它是一个BigInt类,接收字符串作为输入,并将每个数字设置为动态数组。到目前为止,我所要做的就是输入一个BigInt,然后输出它…非常简单。我的程序编译和运行很好,但一旦我输入第一个输入,它就会给我一个奇怪的错误……”这个应用程序请求运行时以一种不寻常的方式终止它。 有关详细信息,请与应用程序的支持团队联系。”,c++,C++,我不知道该如何处理这个问题,因为我无法在代码中找到任何缺陷 有人有什么想法吗 这是我的密码: 头文件: #ifndef BIGINT_H #define BIGINT_H #include <iostream> namespace JHall{ class BigInt { public: BigInt(std::string s = ""); BigInt(const BigInt& b); ~BigInt(); void operato
#ifndef BIGINT_H
#define BIGINT_H
#include <iostream>
namespace JHall{
class BigInt {
public:
BigInt(std::string s = "");
BigInt(const BigInt& b);
~BigInt();
void operator =(const BigInt& b);
friend std::istream& operator >>(std::istream& in, BigInt& b);
friend std::ostream& operator <<(std::ostream& out, const BigInt& b);
private:
short* num;
int cap;
int size;
};
}
#endif /* BIGINT_H */
\ifndef BIGINT\u H
#定义BIGINT_H
#包括
名称空间JHall{
类BigInt{
公众:
BigInt(std::string s=“”);
比吉特(康斯特比吉特&比吉特);
~BigInt();
void运算符=(常量BigInt&b);
friend std::istream&operator>>(std::istream&in,BigInt&b);
friend std::ostream&operator>(std::istream&in、BigInt&b)
{
std::字符串s;
在>>年代;
b、 尺寸=s.长度();
整数计数=0;
对于(int i=b.size-1;i>=0;i--)
b、 num[count++]=strtol(s.substr(i-1,1).c_str(),NULL,10);
返回;
}
std::ostream&operator此行错误:
for(int i = b.size-1; i >= 0; i--)
b.num[count++] = strtol(s.substr(i-1,1).c_str(),NULL,10);
当i等于零时,您要求从-1开始的子字符串。这一行是错误的:
for(int i = b.size-1; i >= 0; i--)
b.num[count++] = strtol(s.substr(i-1,1).c_str(),NULL,10);
当i等于0时,您要求从-1开始的子字符串。一个明显的错误是,您没有在复制构造函数中分配内存:如果每次都使用,您很可能会发生崩溃。另一个相对明显的错误是,您假设最多有100个数字,这似乎是一个不必要的限制gnment操作符在通常情况下复制两次值时似乎做了不必要的工作。此外,使用子字符串和strtol()
将单个数字从char
转换为short
似乎有点过火。正确的方法是使用
int value = s[i] - '0';
也应考虑在构造函数中使用成员初始化器列表。当然,如果你有一个工作拷贝构造函数,你也可能想要实现一个<代码> SWAP()/<代码>方法,然后在赋值运算符中使用它:
BigInt& BigInt::operetor= (BigInt const& other) {
BigInt(other).swap(*this);
return *this;
}
一个明显的错误是,您没有在复制构造函数中分配内存:如果每次都使用,则很可能会发生崩溃。另一个相对明显的错误是,您假设最多有100位数字,这似乎是一个不必要的限制。赋值运算符似乎在复制他计算了两次值。此外,使用子字符串和strtol()
将单个数字从char
转换为short
似乎有点过分。正确的方法是使用
int value = s[i] - '0';
也应考虑在构造函数中使用成员初始化器列表。当然,如果你有一个工作拷贝构造函数,你也可能想要实现一个<代码> SWAP()/<代码>方法,然后在赋值运算符中使用它:
BigInt& BigInt::operetor= (BigInt const& other) {
BigInt(other).swap(*this);
return *this;
}
是的,在调试器中运行它,看看它在哪里断开。当它碰到我的第一个cin>>b1时,它断开了;我不太确定为什么,因为我已经正确地重载了>>操作符来读取我的BIGINT。是的,在调试器中运行它,看看它在哪里断开了。当它碰到我的第一个cin>>b1时,它断开了;我不太确定为什么,因为我已经正确地重载了>>操作符阅读我的Bigint感谢您提供了这些有用的观察结果。我一定会根据您所说的来修复我的代码。我对您如何将该整数值分配给该字符非常感兴趣。我从未见过这种情况,也不知道这是可能的,非常感谢!我可以问一下这到底是如何工作的吗?(将该字符分配给整数)char
只是整数。'0'
是数字序列的基值,也就是说,其他数字的值都是从'0'
开始的。也就是说,'1'='0'+1
,'2'='0'+2
,等等。你可以通过明显的转换利用它:1='1'-'0'
,等等。我的错误是将整数赋给一个字符…相同的差异。此外,我替换了我的子字符串和strtol()使用你的想法,它没有完全正确地工作。当我输入12345作为我的BigInt时,我得到254492345作为我的输出。当它应该是54321时,因为我将它们向后存储。感谢你这些有用的观察结果。我一定会根据你所说的来修复我的代码。我对你如何将整数值分配给字符非常感兴趣。我我从未见过这个,也不知道这是可能的,非常感谢!我可以问一下它到底是如何工作的吗?(将字符指定给整数)char
只是整数。'0'
是数字序列的基值,也就是说,其他数字的值都是从'0'
开始的。也就是说,'1'='0'+1
,'2'='0'+2
,等等。你可以通过明显的转换利用它:1='1'-'0'
,等等。我的错误是指将整数指定给字符…相同的差异。此外,我用您的想法替换了我的子字符串和strtol(),但效果不太好。当我输入12345作为BigInt时,我得到254492345作为我的输出。当它应该是54321时,因为我正在向后存储它们。