当输入日期在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);
//用十六进制存储的从1900年1月1日到2100年末的各农历年的农历月表,第0位只有0或1表示闰月是30天还是29天,1~3位转化为2进制后共十二位char表示非闰月的各月天数大小(1:30,0:29),第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];
}
//获得从1900年1月0日到指定日期所经过的天数
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下测试了一下,你说的异常点没出现啊。你能确定出现问题时输入的年月日么
纯算法问题,抱歉蛤||-_-