C++ 用所有元素初始化为零的数组将吐出随机数
因此,对于我的作业,我必须创建一个计算器,它可以处理长度达256个字符的大整数。我现在要做的任务是,先从较小的数字开始,然后用较大的数字开始。我有一个数组,里面充满了数字,在我所有的测试中,10个数字都能很好地工作。我将数字的值从10改为256,在得到奇怪的数字后,我用一些cout's进行了调查,结果表明,如果我加上00000+00000(可以是任何大小的数字或任何数字,我选择这些数字是因为很容易筛选,因为所有数组元素中的所有数字都应该为零),我会得到一个非常奇怪的答案 (200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 我检查了每个数组元素,其中一些元素将被随机数填充。我的数组初始化为C++ 用所有元素初始化为零的数组将吐出随机数,c++,arrays,element,C++,Arrays,Element,因此,对于我的作业,我必须创建一个计算器,它可以处理长度达256个字符的大整数。我现在要做的任务是,先从较小的数字开始,然后用较大的数字开始。我有一个数组,里面充满了数字,在我所有的测试中,10个数字都能很好地工作。我将数字的值从10改为256,在得到奇怪的数字后,我用一些cout's进行了调查,结果表明,如果我加上00000+00000(可以是任何大小的数字或任何数字,我选择这些数字是因为很容易筛选,因为所有数组元素中的所有数字都应该为零),我会得到一个非常奇怪的答案 (20000000000
digits.[digits]={0}
还尝试了for循环,将数组元素设置为零,结果相同
头文件中的数字设置为256
我注意到的一种模式是,在两个数组中,n1和n2被认为是两个不同的数字被加或减等,在该特定元素上填充相同的数字。因此,出于某种原因,n1[81]和n2[81]都将被设置为9。但是,每次编译和运行程序时,这种情况都会发生变化
下面是完整的代码(方法中的couts仅供我评估这些错误的数组)
#包括
#包括
#包括“Bigint.h”
使用名称空间std;
Bigint::Bigint()
{
数字u[数字]={0};
}
ostream&运算符=0--(一){
如果(n.digits_i]>0){
发现=真;
}
如果(n.digits_[i]!=0 | | found==true){
s+=char(n.digits_[i]+'0');
}
}
如果(s==“”){
s=“0”;
}
返回>(istream&in、Bigint&n)
{
字符串s;
如果(在>>s中){
对于(int i=0;i9){
n1_位=0;
}
如果(n2|U位<0|n2|U位>9){
n2_位=0;
}
printf(“n1:%d\n”,n1\u位);
printf(“n2:%d\n”,n2\u位);
整数和=n1位+n2位+当前进位;
cout问题在于您的构造函数:
Bigint::Bigint()
{
digits_[DIGITS] = { 0 };
}
这里的语法digits\udigits]={0};
不会将digits\udiges>的所有元素初始化为0
。它访问digits
-th元素(超过末尾的一个-这是索引超出范围)并将其设置为0。这是未定义的行为,显示这种行为的程序可能会以任何方式运行—预期的或意外的
修复非常简单。可以使用非常相同的语法(digits\u[digits]={0};
)将所有元素初始化为0
,但必须在声明中使用。因此,为了修复此问题,您必须:
去掉上面的构造函数
将头文件中的int-digits\u[digits];
替换为int-digits\u[digits]={0};
编辑:
您的操作员>>
中似乎有另一个bug。该行:
n.digits_[i] = s[s.length() - 1 - i] - '0';
也会调用未定义的行为,除非s
的length()
正好是数字
。当您输入00000
时,s.length()==5
。现在,您的i
范围是从0
到数字
(255
)。比如说,i==100
,会发生什么?执行以下操作:
n.digits_[100] = s[-96] - '0';
这不是我们想要的。您需要为此添加一个防护。例如:
n.digits_[i] = i < s.length() ? s[s.length() - 1 - i] - '0' : 0;
n.digits\ui]=i
你需要向我们展示。没有它,你的描述就没有什么相关性,因为你所描述的可能是由我的许多事情引起的。@Fureeish好的,抱歉,已经为我所指的课程添加了代码。请向下箭头。三个关键词中的一个是“minimal”。我们没有时间在这里的每篇文章上进行调试的前几个步骤!也不要修改问题以合并解决方案。我刚刚测试了这个问题,但仍然得到了相同的结果。我在使用for循环将每个元素初始化为0时也得到了相同的结果。@Cloppy是否删除了显示未定义行为的构造函数viour?我刚刚注意到,如果我按照你刚才说的做,并对(inti=DIGITS-1;I>=0;--I){DIGITS\ui]=0;}运行以下for循环,它会给出不同的结果" 800000000000000000000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000180000000000000020000000000000002000000000000000000000000000000000000000000000000000 “是的,我确实去掉了表现出未定义行为的构造函数,仍然得到了以2开头的长数字的相同结果。但是正如前面的评论所说,当在头和for循环中应用初始化器时,我不知何故得到了一个不同的数字,我正在ubuntu WSL@Fureeish中使用g++编译
n.digits_[i] = s[s.length() - 1 - i] - '0';
n.digits_[100] = s[-96] - '0';
n.digits_[i] = i < s.length() ? s[s.length() - 1 - i] - '0' : 0;