我遇到了这个程序的问题,即向前和向后打印一个列表,但是当我向后打印列表时,列表中的第一个数字是一个随机的大数而不是正确的数字。例如
0 1 2 3 4 5 6 7 8 0
4286398 8 7 6 5 4 3 2 1 0
请有人解释我的代码有什么问题。
也可以告诉我如何将计数器从printList函数传递给一个名为checkList()的新函数,以便计数器在checkList()中具有与printList()末尾相同的值。
代码:
void printList(int array1[]){
int counter = 0;
int x;
ifstream theFile("list.txt");
while(theFile >> x){
array1[x] = x;
cout << array1[x] << " ";
counter = counter + 1;
}
cout << endl << counter << endl;;
int n = counter;
for(int i = n -1; i >= 0; i--){
cout << array1[i] << " ";
}
答案 0 :(得分:6)
这是罪魁祸首:
array1[x] = x;
如果您的数组输入值为0 1 2 3 4 5 6 7 8 0
,那么在循环的最后一次迭代中,您正在执行array1[0] = 0
。这会覆盖数组中的第一个项目,同时递增计数器。然后,当你反转时array[9]
包含垃圾值,因为你从未设置它。
答案 1 :(得分:4)
array1[0] = 0;
array1[1] = 1;
array1[2] = 2;
array1[3] = 3;
array1[4] = 4;
array1[5] = 5;
array1[6] = 6;
array1[7] = 7;
array1[8] = 8;
array1[0] = 0; // here
array1 [9]未初始化
答案 2 :(得分:4)
由于行array1[x]=x;
,您遇到了问题。如果文件中的数字是0..9,你的代码实际上会工作,但是最后的数字是另一个0,所以你不要将array1 [9]设置为任何东西。
你应该有一些变量来索引数组,例如:
int counter = 0;
while(theFile >> x){
array1[counter] = x;
cout << array1[counter] << " ";
counter = counter + 1;
}
答案 3 :(得分:1)
您在代码中遇到了一些严重问题:
ifstream theFile("list.txt");
while(theFile >> x){
array1[x] = x;//^^this is evil
cout << array1[x] << " ";
counter = counter + 1;
}
cout << endl << counter << endl;;
//^^extra colon, though not wrong here but not good practice
您从文件中读取并填充数组,在您的特殊情况下,您有:
0 1 2 3 4 5 6 7 8 0
您有10个元素,但自上次阅读array1
以及9
再次写为0
后,您的array1[0]
将以0
结尾。因此,当您输出array1
时,您将永远不会获得10
个数字,因为您的数组实际存储了9个数字。这就是为什么你看到垃圾值,如果你试图访问array1[9]
,哪个值没有被填充,一些垃圾原始内存值。
相反,您可以尝试执行以下操作:
int counter = 0;
int x;
ifstream theFile("list.txt");
while(theFile >> x){
array1[counter] = x;
cout << array1[counter] << " ";
counter = counter + 1;
}
cout << endl << counter << endl;;
答案 4 :(得分:0)
你向上计算错误并最终在你的阵列之后击中未初始化的内存。您应该将数组的长度作为参数传递给函数 当数组衰减到指针时,你将无法恢复它的长度。
void printList(int array1[], into size){ }
然后你不需要弄清楚它的长度如此复杂。