我过去曾多次读过堆栈溢出线程,而且它们通常非常有用。但是,我遇到了一个对我来说根本没有意义的问题,而我正试图弄清楚我错过了什么。以下是我遇到问题的代码部分:
class BigInts
{
public:
static const std::size_t MAXLEN = 100;
BigInts(signed int i); //constructor
BigInts(std::string &); //other constructor
std::size_t size() const;
digit_type operator[](std::size_t ) const;
private:
digit_type _data[MAXLEN];
bool _negative;
int _significant;
};
//nonmember functions
std::ostream & operator << (std::ostream &, const BigInts &);
BigInts::BigInts(signed int i)
{
_negative = (i < 0);
if (i < 0)
{
i = -1*i;
}
std::fill(_data, _data+MAXLEN, 0);
if (i != 0)
{
int d(0);
int c(0);
do
{
_data[d++] = ( i % 10);
i = i / 10;
c++; //digit counter
}while(i > 0);
//_significant = c; //The problem line
assert(c <= MAXLEN); //checks if int got too big
}
}
std::size_t BigInts::size() const
{
std::size_t pos(MAXLEN-1);
while (pos > 0 && _data[pos] == 0)
--pos;
return pos+1;
}
std::ostream & operator << (std::ostream & os, const BigInts & b)
{
for (int i = (b.size() - 1); i >= 0; --i)
os << b[i];
return os;
}
int main()
{
signed int a, b;
std::cout << "enter first number" << std::endl;
std::cin >> a;
std::cout << "enter second number" << std::endl;
std::cin >> b;
BigInts d(a), e(b), f(b);
std::cout << d << " " << e << " " << f;
主要编辑,从尝试的虚拟版本代码切换到我正在使用的实际代码,完成原始变量名称。我试图删除任何与我正在使用的代码无关的内容,但如果你看到一个奇怪的名字或打电话,请告诉我,我可以发布相关部分。
在引入_significant之前,代码一直运行正常,这是我添加的一个变量,用于为整个类添加更多功能。但是,当我尝试使用您看到的主要功能驱动它的基本部分时,它遇到了很大的错误。例如,我分别为a和b输入200和100,为d,e和f输出201,1和3。目前的情况是,只有当我试图将c的值赋给它时,才会出现_tignificant。
答案 0 :(得分:0)
原始代码中的行i - 1;
看起来非常可疑。您想写i -= 1;
还是--i;
还是其他什么?
它将i递减1然后抛弃结果。
答案 1 :(得分:0)
我现在唯一能看到的错误是,当输入为零时,_significant
未初始化。
在调试器中逐步执行它,确保正确的数字在数组中结束,并且数组数据未被意外覆盖。
编辑:It works for me (cleaned up slightly)。更清理,也工作:http://ideone.com/MDQF8
答案 2 :(得分:0)
如果您的类纯粹通过分配成员变量而被破坏,那意味着堆栈损坏毫无疑问。虽然我无法随意查看源代码,但您应该使用自行长度检查类替换所有缓冲区以验证访问。