向量下标超出范围 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]
在函数中使用。
我正在使用 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]
在函数中使用。