当输入日期在1984年7月左右之后时会触发一个断点,估计是堆溢出,求错误原因

当输入日期在1984年7月左右之后时会触发一个断点,估计是堆溢出,求错误原因
//head.h

#pragma once
#include<iostream>
#include<math.h>
#include<string>
using namespace std;

void transform_0x_to_01(char from_0x[], int loca, char to_01[]);
void creat_lunar_month_list(char list[14], char reg_0x[5], char reg_s[12], int year);
int check_runyue(int year, char reg_0x[5]);
void lunarDate(int n, char list[14], char reg_0x[5], char reg_s[12]);
bool is_LeapYear(int year);
int get_Days_In_Month(int year, int month);
int gregorianDate_to_days(int year, int month, int day);
void days_to_gregorian_date(int n);




//用十六进制存储的从190011日到2100年末的各农历年的农历月表,第0位只有01表示闰月是30天还是29天,1~3位转化为2进制后共十二位char表示非闰月的各月天数大小(130029),第4位即最后一位表示闰月跟在几月之后如果是0,则该农历年无闰月
string lunarInfo[] = {"00010","04bd8","04ae0","0a570","054d5","0d260","0d950","16554","056a0","09ad0","055d2",//0100101110001101
    "04ae0","0a5b6","0a4d0","0d250","1d255","0b540","0d6a0","0ada2","095b0","14977",//010010101110
    "04970","0a4b0","0b4b5","06a50","06d40","1ab54","02b60","09570","052f2","04970",
    "06566","0d4a0","0ea50","06e95","05ad0","02b60","186e3","092e0","1c8d7","0c950",
    "0d4a0","1d8a6","0b550","056a0","1a5b4","025d0","092d0","0d2b2","0a950","0b557",
    "06ca0","0b550","15355","04da0","0a5b0","14573","052b0","0a9a8","0e950","06aa0",
    "0aea6","0ab50","04b60","0aae4","0a570","05260","0f263","0d950","05b57","056a0",
    "096d0","04dd5","04ad0","0a4d0","0d4d4","0d250","0d558","0b540","0b6a0","195a6",
    "095b0","049b0","0a974","0a4b0","0b27a","06a50","06d40","0af46","0ab60","09570",//1011001001011
    "04af5","04970","064b0","074a3","0ea50","06b58","055c0","0ab60","096d5","092e0",
    "0c960","0d954","0d4a0","0da50","07552","056a0","0abb7","025d0","092d0","0cab5",
    "0a950","0b4a0","0baa4","0ad50","055d9","04ba0","0a5b0","15176","052b0","0a930",
    "07954","06aa0","0ad50","05b52","04b60","0a6e6","0a4e0","0d260","0ea65","0d530",
    "05aa0","076a3","096d0","04afb","04ad0","0a4d0","1d0b6","0d250","0d520","0dd45",
    "0b5a0","056d0","055b2","049b0","0a577","0a4b0","0aa50","1b255","06d20","0ada0",
    "14b63","09370","049f8","04970","064b0","168a6","0ea50","06b20","1a6c4","0aae0",
    "0a2e0","0d2e3","0c960","0d557","0d4a0","0da50","05d55","056a0","0a6d0","055d4",
    "052d0","0a9b8","0a950","0b4a0","0b6a6","0ad50","055a0","0aba4","0a5b0","052b0",
    "0b273","06930","07337","06aa0","0ad50","14b55","04b60","0a570","054e4","0d160",
    "0e968","0d520","0daa0","16aa6","056d0","04ae0","0a9d4","0a2d0","0d150","0f252",
    "0d520"
};
//翻译上表为2进制
void transform_0x_to_01(char from_0x[], int loca, char to_01[]) {
    int n = loca * 4, i = 0;
    switch (from_0x[loca + 1])
    {
    case'0':for (;i < 4;i++) { to_01[n + i] = '0'; }break;
    case'1':for (;i < 3;i++) { to_01[n + i] = '0'; }    to_01[n + i] = '1'; break;
    case'2':for (;i < 2;i++) { to_01[n + i] = '0'; }    to_01[n + i] = '1';++i;to_01[n + i] = '0';break;
    case'3':for (;i < 2;i++) { to_01[n + i] = '0'; }for (;i < 4;i++) { to_01[n + i] = '1'; }break;
    case'4':to_01[n + i] = '0';i++;to_01[n + i] = '1';i++;for (;i < 4;i++) { to_01[n + i] = '0'; }break;
    case'5':to_01[n + i] = '0';i++;to_01[n + i] = '1';i++;to_01[n + i] = '0';i++;to_01[n + i] = '1';i++;break;
    case'6':for (;i < 2;i++) { to_01[n + i] = '1'; }for (;i < 4;i++) { to_01[n + i] = '0'; }break;
    case'7':to_01[n + i] = '0';i++;for (;i < 4;i++) { to_01[n + i] = '1'; }break;
    case'8':to_01[n + i] = '1';i++;for (;i < 4;i++) { to_01[n + i] = '0'; }break;
    case'9':to_01[n + i] = '1';i++;for (;i < 3;i++) { to_01[n + i] = '0'; }to_01[n + i] = '1'; break;
    case'a':to_01[n + i] = '1';i++;to_01[n + i] = '0';i++;to_01[n + i] = '1';i++;to_01[n + i] = '0';i++;break;
    case'b':to_01[n + i] = '1';i++;to_01[n + i] = '0';i++;for (;i < 4;i++) { to_01[n + i] = '1'; }break;
    case'c':for (;i < 2;i++) { to_01[n + i] = '1'; }for (;i < 4;i++) { to_01[n + i] = '0'; }break;
    case'd':for (;i < 2;i++) { to_01[n + i] = '1'; }to_01[n + i] = '0';i++;to_01[n + i] = '1';break;
    case'e':for (;i < 3;i++) { to_01[n + i] = '1'; }to_01[n + i] = '0';break;
    case'f':for (;i < 4;i++) { to_01[n + i] = '1'; }break;
    }
}

//创建指定农历年的农历月表
void creat_lunar_month_list(char list[14], char reg_0x[5], char reg_s[12], int year) {
    for (int i = 0;i < 14;i++) { list[i] = '\0'; }
    //strcpy(reg_0x, (lunarInfo + year - 1900)->c_str());
    lunarInfo[year - 1900].copy(reg_0x, 5, 0);
    if (reg_0x[4] == '0') {
        for (int i = 0;i < 3;i++) {
            transform_0x_to_01(reg_0x, i, list);
        }
    }
    else {
        list[(int)(reg_0x[4] - '0')] = ((int)(reg_0x[0] - '0')) ? '1' : '0';
        for (int i = 0;i < 3;i++) {
            transform_0x_to_01(reg_0x, i, reg_s);
        }
        for (int i = 0, j = 0;i < 12;) {
            if (list[j + i] == '\0') {
                list[j + i] = reg_s[i];
                i++;
            }
            else {
                j++;
            }
        }
    }
}

//检查是否有闰月如果有则返回是闰几月
int check_runyue(int year, char reg_0x[5]) {
    //strcpy(reg_0x, (lunarInfo + year - 1900)->c_str());
    lunarInfo[year - 1900].copy(reg_0x, 5, 0);
    if (reg_0x[4] == '0') return 0;
    else return (int)(reg_0x[4] - '0');
}

//打印给定的农历日期
void lunarDate(int n, char list[14], char reg_0x[5], char reg_s[12]) {
    int y = 1900, m = 11,runyue=0,mo=12;
    creat_lunar_month_list(list, reg_0x, reg_s, y);
    int days_in_lunar_month = ((int)(list[m] - '0'))? 30:29;
    while (n > days_in_lunar_month)
    {
        n = n - days_in_lunar_month;
        cout << n << endl;
        //cout << m << endl;
        m = (m + 1) % mo;
        if (m == 0) {
            y++;
            //问题出在此处→
            creat_lunar_month_list(list, reg_0x, reg_s, y);
            //cout << m << 2<<endl;
            runyue = check_runyue(y,reg_0x);
            if (runyue) mo = 13;
            else mo = 12;
        }
        days_in_lunar_month = ((int)(list[m] - '0')) ? 30 : 29;
    }
    cout << m << " " << n<<endl;
}

int daysInMonth[] = { 31,28,31,30,31,30,31,31,30,31,30,31 };
//判断是否是闰年
bool is_LeapYear(int year) {
    return (((year % 4 == 0) && (year % 100 != 0)) || (year % 400 == 0));
}
//得到该月对应的天数,考虑闰年
int get_Days_In_Month(int year, int month) {
    if (is_LeapYear(year) && month == 1) return 29;
    else return daysInMonth[month];
}

//获得从190010日到指定日期所经过的天数
int gregorianDate_to_days(int year, int month, int day) {
    int days = 0;
    for (int i = 1900;i < year;i++) {
        if (is_LeapYear(i)) days = days + 366;
        else days = days + 365;
    }
    month--;
    for (int i = 0;i < month;i++) {
        days = days + get_Days_In_Month(year, i);
    }
    days = days + day;
    return days;
}
//根据累计日打印日期
void days_to_gregorian_date(int n) {
    int y = 1900, m = 0;
    while (n > get_Days_In_Month(y, m))
    {
        n = n - get_Days_In_Month(y, m);
        m = (m + 1) % 12;
        if (m == 0)  y++;
    }
    int year = y;
    int month = m + 1;
    int day = n;
    cout << year << "年" << month << "月" << day << "日" << endl;
}

//main.cpp

#include "head.h"

int main() {
    char lunar_m_list[14], reg_0x[5], reg_s[12];
    int year, month, day;
    cin >> year >> month >> day;
    lunarDate(gregorianDate_to_days(year, month,day ), lunar_m_list, reg_0x, reg_s);
    return 0;
}

我在VS2010下测试了一下,你说的异常点没出现啊。你能确定出现问题时输入的年月日么

纯算法问题,抱歉蛤||-_-