Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/125.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 用所有元素初始化为零的数组将吐出随机数_C++_Arrays_Element - Fatal编程技术网

C++ 用所有元素初始化为零的数组将吐出随机数

C++ 用所有元素初始化为零的数组将吐出随机数,c++,arrays,element,C++,Arrays,Element,因此,对于我的作业,我必须创建一个计算器,它可以处理长度达256个字符的大整数。我现在要做的任务是,先从较小的数字开始,然后用较大的数字开始。我有一个数组,里面充满了数字,在我所有的测试中,10个数字都能很好地工作。我将数字的值从10改为256,在得到奇怪的数字后,我用一些cout's进行了调查,结果表明,如果我加上00000+00000(可以是任何大小的数字或任何数字,我选择这些数字是因为很容易筛选,因为所有数组元素中的所有数字都应该为零),我会得到一个非常奇怪的答案 (20000000000

因此,对于我的作业,我必须创建一个计算器,它可以处理长度达256个字符的大整数。我现在要做的任务是,先从较小的数字开始,然后用较大的数字开始。我有一个数组,里面充满了数字,在我所有的测试中,10个数字都能很好地工作。我将数字的值从10改为256,在得到奇怪的数字后,我用一些cout's进行了调查,结果表明,如果我加上00000+00000(可以是任何大小的数字或任何数字,我选择这些数字是因为很容易筛选,因为所有数组元素中的所有数字都应该为零),我会得到一个非常奇怪的答案

(200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

我检查了每个数组元素,其中一些元素将被随机数填充。我的数组初始化为

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;