mymoon 发表于 2021-4-18 21:31

自己编的代码,自己也搞不懂了,闪退原因是什么啊?

本帖最后由 mymoon 于 2021-4-19 08:06 编辑

#include <iostream>
#include<ctype.h>
using namespace std;
int main()
{
      cout<<"闪退代表输入字符非数字或是浮点数"<<endl;
      cout<<"请输入一个不是字符q的字符进入循环输入,输入q退出循环"<<endl;
         while(getchar()!='q'){
               int year,month,day;
               cout<<"请输入 3 个整数:"<<endl;
                  cin>>year>>month>>day;
                if(isalpha(year)==2||isalpha(month)==2||isalpha(day)==2){    //判断输入字符是字母
                  //不知道怎么处理
                        
                        
                }else if (isdigit(year)==0||isdigit(month)==0||isdigit(day)==0)   //判断输入字符是数字
                {
                        if(month<1||month>12||day<1||day>31||year<1){             //超出取值范围处理
                              if(month<1||month>12) cout<<"不满足月份条件取值范围"<<endl;
                                 if(day<1||day>31)cout<<"不满足日期取值条件范围"<<endl;
                                 if(year<1)          cout<<"不满足年份取值条件范围"<<endl;
                        }else{
                           if((year%4==0 && year%100!=0)||(year%400==0)){             //闰年的情况
                               if(month==2&&day==29)
                                     cout<<year<<"-"<<month+1<<"-"<<01<<endl;
                                  else if((month==1||month==3||month==5||month==7||month==8||month==10)&&(day==31))
                                    cout<<year<<"-"<<month+1<<"-"<<01<<endl;
                                  else if(month==12&&day==31)
                                       cout<<year+1<<"-"<<01<<"-"<<01<<endl;
                                  else
                                       cout<<year<<"-"<<month<<"-"<<day+1<<endl;
                              }
                            else{                                                      //非闰年
                                 if(month==2&&day==28)
                                    cout<<year<<"-"<<month+1<<"-"<<01<<endl;
                                 else if((month==1||month==3||month==5||month==7||month==8||month==10)&&(day==31))
                                    cout<<year<<"-"<<month+1<<"-"<<01<<endl;
                                 else if(month==12&&day==31)
                                       cout<<year+1<<"-"<<01<<"-"<<01<<endl;
                                 else
                                       cout<<year<<"-"<<month<<"-"<<day+1<<endl;
                                 }
                        }   
                }
         else{//不知道怎么处理
      }      
               
      }
      system("pause");
      return 1;
}
我的这个代码输入一个年月日,输出第二天的年月日。if套if,有点混乱,见谅。我把代码搞这么乱是因为当输入的年月日不是整数时,输出提示错误。我阴差阳错自己也不知道原因的达成了只要输入字母或标点符号等非数字,以及浮点数时,会闪退推出。其他情况正常,问问大家,这是怎么回事?

yany936 发表于 2021-4-18 21:38

你完全可以限制这些非理想数据的输入来达到不闪退的目的。

mymoon 发表于 2021-4-18 22:11

yany936 发表于 2021-4-18 21:38
你完全可以限制这些非理想数据的输入来达到不闪退的目的。

我用了isdigit方法限制,但效果并不好。当定义year,month,day为int变量是,即使输入的是其他字符,程序只会当未输入,默认为2000000或其他很大的数字。头疼的是,输入三个字母时第一个会默认为0,第二三个是很大的数,但0本身是我要输入的一个异常值。

老湿机 发表于 2021-4-18 23:11

else{//不知道怎么处理}
兄弟你这句代码写的牛逼啊,编译器都编译过了?

归海踏歌 发表于 2021-4-18 23:42

最后的else,那个}是不是注释掉了

luanshils 发表于 2021-4-18 23:43

try捕捉异常防止一下

小兴818 发表于 2021-4-19 07:03

最后的else,那个}被你注释掉了

mymoon 发表于 2021-4-19 07:59

mymoon 发表于 2021-4-18 22:11
我用了isdigit方法限制,但效果并不好。当定义year,month,day为int变量是,即使输入的是其他字符,程序只 ...

输入非数字,我发现变量值依次为0,4020000,6040000.输入浮点数,依次为不固定的一个值,0,4020000.
最终版
#include <iostream>
using namespace std;

intjudge(int month,int day){
        int flag=0;
if((month==1||month==3||month==5||month==7||month==8||month==10||month==12)&&(day<31))
      flag=1;
if((month==4||month==6||month==9||month==11)&&(day<30))
   flag=1;
if(month==2)
       flag=2;
   return flag;
}
voidnormalprint(int year,int month,int day){
    if((month==1||month==3||month==5||month==7||month==8||month==10)&&(day==31))
       cout<<year<<"-"<<month+1<<"-"<<01<<endl;
        else if((month==4||month==6||month==9||month==11)&&(day==30))
       cout<<year<<"-"<<month+1<<"-"<<01<<endl;
    else if(month==12&&day==31)
    cout<<year+1<<"-"<<01<<"-"<<01<<endl;
        else if(judge(month,day)==1)
        cout<<year<<"-"<<month<<"-"<<day+1<<endl;
       else if(judge(month,day)==0)
        cout<<"日期范围超出了大月31天的范围或小月30天"<<endl;
       
}
int main()
{
        cout<<"请输入一个不是字符q的字符进入循环输入,输入q退出循环"<<endl;
    while(getchar()!='q'){
               int year,month,day;
               cout<<"请输入 3 个整数:"<<endl;
          cin>>year>>month>>day;
                  if(year==0&&month>1000000&&day>1000000)
                        cout<<"输入了非数字"<<endl;
                  break;
                        if(year>=0&&month==0&&day>1000000)
                        break;
                        if(month<1||month>12||day<1||day>31||year<1){
                                if(month<1||month>12) cout<<"不满足月份条件取值范围"<<endl;
                        if(day<1||day>31)cout<<"不满足日期取值条件范围"<<endl;
                if(year<1)          cout<<"不满足年份取值条件范围"<<endl;
                        }else{
                       if((year%4==0 && year%100!=0)||(year%400==0)){
                  if(month==2&&day==29)
                                  cout<<year<<"-"<<month+1<<"-"<<01<<endl;
                                  if(month==2&&day>29)
                   cout<<"闰年2月最多29天"<<endl;
                                  if(month==2&&day<29)
                                          cout<<year<<"-"<<month<<"-"<<day+1<<endl;
                                  
                                  normalprint(year,month,day);
                       }
                       else{
                               if(month==2&&day==28)
                               cout<<year<<"-"<<month+1<<"-"<<01<<endl;
                                  if(month==2&&day>28)
                               cout<<"平年2月最多28天"<<endl;
                               if(month==2&&day<28)
                                       cout<<year<<"-"<<month<<"-"<<day+1<<endl;
                                  normalprint(year,month,day);
                               
                       }
             }   
                }
        system("pause");
      return 1;
}

smile6486 发表于 2021-4-19 09:09

前来学习知识。

donspe 发表于 2021-4-19 09:27

老湿机 发表于 2021-4-18 23:11
else{//不知道怎么处理}
兄弟你这句代码写的牛逼啊,编译器都编译过了?

哈哈哈哈
页: [1] 2
查看完整版本: 自己编的代码,自己也搞不懂了,闪退原因是什么啊?