我正在创建一个程序,用文件中的值重写数组。我已将以下代码链接起来。运行该文件时,我收到错误"运行时检查失败,堆栈' arr'变量已损坏。
此外,程序的输出返回所有具有相同编号的阵列位置
arr[0] = -858993460
文件中用数字分隔的数字是:
12
13
15
#include<iostream>;
#include<fstream>;
using namespace std;
template <class T>
void init(T * a, int size, T v)//done
{
for (int i = 0; i < size; i++)
{
a[size] = v;
}
}
bool getNumbers(char * file, int * a, int & size)//not done
{
int count = 0;
ifstream f(file);
while (f.good() == true && count < 1)
{
f >> a[count];
count++;
}
if (size > count)
{
return true;
}
else if (size < count)
{
return false;
}
}
void testGetNumbers()
{
int arr[5];
int size = 5;
cout << "Testing init and getNumbers." << endl;
init(arr, 5, -1);
cout << "Before getNumbers: " << endl;
for (int i = 0; i < size; i++)
{
cout << "arr[" << i << "] = " << arr[i] << endl;
}
if (getNumbers("nums.txt", arr, size))
{
cout << size << " numbers read from file" << endl;
}
else
{
cout << "Array not large enough" << endl;
}
cout << "After getNumbers: " << endl;
for (int i = 0; i < size; i++)
{
cout << "arr[" << i << "] = " << arr[i] << endl;
}
cout << endl;
}
int main()
{
testGetNumbers();
return 0;
}
答案 0 :(得分:1)
第一个循环中的这一行看起来有错误。
a[size] = v;
它导致数组绑定访问和内存/堆栈损坏。它应该是
a[i] = v;
答案 1 :(得分:0)
从'9'
函数开始,行
main
...不是必需的,因为这是return 0;
的默认返回值。我会删除它,有些人坚持拥有它,我想大多数人都不在乎。但是,通过隐式或显式地完全了解代码表达的内容总是一个好主意,因此:返回0表示程序成功。
对于明确的main
返回值,我建议您使用main
标题中的EXIT_SUCCESS
和EXIT_FAILURE
名称。
然后更清楚。
<stdlib.h>
调用main
,除输出语句外,它的开头如下:
testGetNumbers
碰巧int arr[5];
int size = 5;
init(arr, 5, -1);
函数有未定义行为且没有按预期填充数组init
,但忽略不计。现在,只看上面的冗长。考虑写一下这个:
-1
使用vector<int> arr( 5, -1 );
标题中的std::vector
。
将调用链下移到<vector>
后,找到
init
尝试将值a[size] = v;
分配给超出数组末尾的项目。
未定义的行为。
应该是
v
但是如上所述,除非您的老师严格禁止,否则当您使用a[i] = v;
时,整个功能都是多余的。
在std::vector
备份,然后调用testGetNumbers
,在我们找到的该功能中
getNumbers
通常情况下,不应在循环条件中使用ifstream f(file);
while (f.good() == true && count < 1)
{
f >> a[count];
count++;
}
或f.good()
:使用f.eof()
。此外,〜永远不要将布尔值与f.fail()
或true
进行比较,只需直接使用即可。然后循环可能如下所示:
false
提示:在标准C ++中,您可以将ifstream f(file);
while (!f.fail() && count < 1)
{
f >> a[count];
count++;
}
写为!
,将not
写为&&
。使用Visual C ++编译器,您必须包含and
标头才能执行此操作。
免责声明:此处提及的修补程序并不保证循环正确用于您的预期目的。实际上,当输入操作失败时,<iso646.h>
的增量看起来可能是无意的。同样适用于循环限制。
该功能继续(或更确切地说,结束)
count
这有一个很大的问题:如果if (size > count)
{
return true;
}
else if (size < count)
{
return false;
}
怎么办?然后执行继续从函数的末尾开始,而不返回值。这又是未定义的行为。
我留给你来决定你希望函数在这种情况下返回什么,并确保它能做到。
答案 2 :(得分:0)
在DELETE
FROM course
WHERE course.course_id NOT IN( SELECT section.course_id FROM section );
函数中......
init
都能跟得上:
template <class T>
void init(T * a, int size, T v)//done
{
for (int i = 0; i < size; i++)
{
a[size] = v;
}
}
烨:
a[size] = v;