矢量下标超出范围 AND 应用程序无法正确启动 [c++]



我正在使用Visual Studio用c ++编写非常简单的程序,但是我不断收到2个错误,我可以使用一些帮助。
当我在应用程序崩溃后运行本地Windows调试器时,有时会弹出一个,它说:
应用程序无法正确启动(0xc0000142)

运行时有时显示消息

第二个我猜发生在cin>> kwota之后;。真的不知道什么时候,因为VS没有显示任何异常。它只是来自操作系统的消息框。它说:
调试断言失败!
[...]
文件:"C:\程序文件 (x86)\Microsoft Visual Studio\2019\社区\VC\Tools\MSVC\14.29.30133\include\vector">
行:1566
表达式:矢量下标超出范围

第二次放入CIN后的消息

这里有我的代码。我不知道是什么原因造成的,所以任何帮助都会很棒。

#include <iostream>
#include <vector>
#include <string>
#include <sstream>
#include <algorithm>
using namespace std;
int wyznaczZlote(vector<int> c, int z, int k)
{
int nowakwota, pozycja, ilosc;
if (z > k)
return 0;
for (int p = k/z; p >= 0; p--)
{
nowakwota = k % z;
while (nowakwota > 0)
{
pozycja = c.size() - 1;
while (c[pozycja] > nowakwota && pozycja >= 0)
{
pozycja--;
if (pozycja < 0)
break;
}
if (pozycja < 0)
break;
ilosc = nowakwota / c[pozycja];
nowakwota = nowakwota % c[pozycja];
}
if (nowakwota == 0)
return p;
}
return -1;
}
int main()
{
int ilecyna, ilezloto, kwota, liczbazlotych;
vector<int> cyna;
vector<int> zloto;
string wejscie, wejscie2;
cin >> ilecyna;
cin.ignore();
getline(cin, wejscie);
stringstream wejscieStream(wejscie);
int element;
for (int i = 0; i < ilecyna; i++)
{
wejscieStream >> element;
cyna.push_back(element);
}
sort(cyna.begin(), cyna.end());

cin >> ilezloto;
cin.ignore();
getline(cin, wejscie2);
stringstream wejscieStream2(wejscie2);
for (int i = 0; i < ilecyna; i++)
{
wejscieStream2 >> element;
cyna.push_back(element);
}
sort(zloto.begin(), zloto.end());
cin >> kwota;
liczbazlotych = wyznaczZlote(cyna, zloto[0], kwota);
cout << 'n';
if (liczbazlotych >= 0)
cout << liczbazlotych << 'n';
else
cout << "NIE" << 'n';
cin.ignore();
getchar();
}

谢谢!

此声明

cin >> wejscie;

一旦遇到空格字符,只需输入一个单词。

所以这个 for 循环没有意义。

stringstream wejscieStream(wejscie);
int element;
for (int i = 0; i < ilecyna; i++)
{
wejscieStream >> element;
cyna.push_back(element);
}

而不是在此语句中使用运算符>>

cin >> wejscie;

看来你需要使用这样的std::getline

std::getline( std::cin, wejscie );

但是在使用它之前,您需要清除输入缓冲区,例如

#include <lomits>
//...
std::cin.ignore( std::numeric_limits<std::streamsize>::max(), 'n' );

还有这个 for 循环

for (size_t p = k/z[0]; p >= 0; p--)

是一个无限的 for 循环,因为具有无符号整数类型的变量p永远不会小于0size_t

而这个while循环是可疑的

while (c[pozycja] > nowakwota)
pozycja--;

因为没有检查pozycja是否小于 0。

并使用英语单词作为变量的标识符。否则,大多数用户将无法读取您的代码。

也不清楚为什么第二个参数表示向量

vector<int> z

而唯一的一个它的元素z[0]在函数中使用。

最新更新