我是编程初学者。最近,我编写了一个程序,用于从字符串日期提取日、月、年,并将其转换为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];Exception thrown at 0x5B03297A (msvcp140d.dll) in Project6.exe: 0xC0000005: Access violation writing location 0x01116890.
发布于 2018-05-13 06:31:06
三个错误:
有三个代币在日期所以
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。
你也可以消除所有的全局变量,但是死池是打开的,所以我要退出。
发布于 2018-05-13 06:27:55
当达到此条件( true:(str_date.find('/') == str_date.npos) )时,变量j包含值2。在此条件下,调用ss >> a[j];,即试图访问大小为2的数组的第三个元素的ss >> a[2];。您必须声明int a[3]。
此外,当j访问2时,您必须中断递归,否则"12/05/12/1234“将再次使程序崩溃。最后,在条件下调用get_date():
if (j < 3)
get_date();https://stackoverflow.com/questions/50313121
复制相似问题