gpt4 book ai didi

c++ - 关于异常(exception)成长

转载 作者:行者123 更新时间:2023-11-28 01:33:48 25 4
gpt4 key购买 nike

我是编程初学者。最近,我编写了一个程序来从字符串日期中获取日、月、年并将其转换为 int 并分配给数组的元素。但是 VS 在编译时返回一个错误,我不太明白。请帮我解释一下!提前致谢!我的程序

using namespace std;

int a[2];
int j = 0;
string str_date;
string str_date_sub;

void get_date()
{
if (str_date.find('/') == str_date.npos)
{
stringstream ss(str_date);
ss >> a[j];
}
for (int i = 0; i <= str_date.length(); i++)
{
if (str_date[i] == '/')
{
str_date_sub = str_date.substr(0, i - 1);
str_date.erase(0, i + 1);
stringstream ss(str_date_sub);
ss >> a[j];
j++;
break;
}
}
get_date();
}

int main()
{
cout << "Please input the date DD/MM/YYYY:\n";
str_date = "12/05/1234";
get_date();
cout << a[1];
system("pause");
return 0;
}

编辑:错误在这里

ss >> a[j];

Project6.exe 中的 0x5B03297A (msvcp140d.dll) 抛出异常:0xC0000005:访问冲突写入位置 0x01116890。

最佳答案

三个错误:

date中有3个token所以

int a[2];

需要

int a[3];

下一个

str_date_sub = str_date.substr(0, i - 1);

第二个参数是子串的长度,所以

str_date_sub = str_date.substr(0, i);

比较合适。

最后,在 get_date

get_date();

总是被调用,导致不受控制的递归。最终程序耗尽了自动存储空间,之后所有的赌注都被取消了。如果有更多的字符串需要解析,你只想重新进入函数。最简单的解决方法是放置一个 return在结束时

if (str_date.find('/') == str_date.npos)
{
stringstream ss(str_date);
ss >> a[j];
return; // right here
}

但为什么要到此为止呢?

if (str_date.find('/') == str_date.npos)

找到了 / 的位置,所以为什么

for (int i = 0; i <= str_date.length(); i++)

嗯。制造那4个错误。 i <= str_date.length()将在str_date的范围外行进.

无论如何,这个循环没有意义。你可以

auto pos = str_date.find('/');

然后使用 pos用于其余功能。

你也可以删除所有的全局变量,但是死侍还在,所以我退出了。

关于c++ - 关于异常(exception)成长,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50313121/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com