首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >关于成长的异常

关于成长的异常
EN

Stack Overflow用户
提问于 2018-05-13 05:43:34
回答 2查看 27关注 0票数 0

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

代码语言:javascript
复制
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;
}

编辑:错误在这里

代码语言:javascript
复制
ss >> a[j];

Exception thrown at 0x5B03297A (msvcp140d.dll) in Project6.exe: 0xC0000005: Access violation writing location 0x01116890.

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-05-13 06:31:06

三个错误:

有三个代币在日期所以

代码语言:javascript
复制
int a[2];

需要的是

代码语言:javascript
复制
int a[3];

下一个

代码语言:javascript
复制
str_date_sub = str_date.substr(0, i - 1);

第二个参数是子字符串的长度,因此

代码语言:javascript
复制
str_date_sub = str_date.substr(0, i);

更合适。

最后,在get_date

代码语言:javascript
复制
get_date();

总是被调用,导致不受控制的递归。最终,程序耗尽了自动存储,然后所有的赌注都取消了。只有在需要解析更多字符串的情况下,才需要重新输入函数。最简单的修复方法是将一个return放在

代码语言:javascript
复制
if (str_date.find('/') == str_date.npos)
{
    stringstream ss(str_date);
    ss >> a[j];
    return; // right here
}

但为什么停在那里?

代码语言:javascript
复制
if (str_date.find('/') == str_date.npos)

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

代码语言:javascript
复制
for (int i = 0; i <= str_date.length(); i++)

哈。制造出4只虫子。i <= str_date.length()将走出str_date的界限。

不管怎么说,这个循环没有意义。你可以的

代码语言:javascript
复制
auto pos = str_date.find('/');

然后对函数的其余部分使用pos

你也可以消除所有的全局变量,但是死池是打开的,所以我要退出。

票数 1
EN

Stack Overflow用户

发布于 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()

代码语言:javascript
复制
if (j < 3)
  get_date();
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50313121

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档