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

Vector subscript out of range AND The application was unable to start correctly [c++]

我正在使用 Visual Studio 在 C++ 中编写非常简单的程序,但我不断收到 2 个错误,我需要一些帮助。
当应用程序崩溃后我 运行 Local Windows Debugger 有时会弹出一个,它说:
应用程序无法正确启动(0xc0000142)

message sometimes when running

我猜第二个发生在 cin >> kwota; 之后。虽然真的不知道什么时候,因为 VS 没有显示任何异常。它只是来自 os 的消息框。它说:
调试断言失败!
[...]
文件:“C:\Program Files (x86)\Microsoft Visual Studio19\Community\VC\Tools\MSVC.29.30133\include\vector”
行:1566
表达式:向量下标超出范围

message after puting second time into 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;

一遇到白色space字符就只输入一个字。

所以这个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--)

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

而且这个 while 循环是可疑的

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

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

并使用英文单词作为变量的标识符。否则你的代码对于大多数用户来说将是不可读的。

另外不清楚为什么第二个参数表示一个向量

vector<int> z

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